Hex Artifact Content

Artifact 876a0b1ced754112153362f65a869e17095e76d8233bf7622c839c8de70655aa:


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 0c 0a 2f 2a 2a 2a 2a 2a  ADS */..../*****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
09a0: 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20  ./* Callbacks   
09b0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 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 45  --------. *. * E
0a20: 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d  val Callback Com
0a30: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76  mand --. *. *.Ev
0a40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
0a50: 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e  and and catch an
0a60: 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52  y errors. *. * R
0a70: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43  esults:. *.0 = C
0a80: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a90: 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74  fail or eval ret
0aa0: 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a  urned TCL_ERROR.
0ab0: 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.1 = Command r
0ac0: 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20  eturned success 
0ad0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0ae0: 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69   TCL_OK. *. * Si
0af0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45  de effects:. *.E
0b00: 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63  valuates callbac
0b10: 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d  k command. *. *-
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
0b70: 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54  t.EvalCallback(T
0b80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b90: 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50  p, State *stateP
0ba0: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64  tr, Tcl_Obj *cmd
0bb0: 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63  Ptr) {.    int c
0bc0: 6f 64 65 2c 20 6f 6b 3b 0a 0a 20 20 20 20 54 63  ode, ok;..    Tc
0bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
0be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
0bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
0c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
0c30: 77 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72  with success for
0c40: 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61   ok or return va
0c50: 6c 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20  lue 1, fail for 
0c60: 65 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20  error or return 
0c70: 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 63  value 0 */.    c
0c80: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
0c90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
0ca0: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
0cb0: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
0cc0: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
0cd0: 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74  ./* Check result
0ce0: 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75   for return valu
0cf0: 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72  e */..Tcl_Obj *r
0d00: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
0d10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
0d20: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d  ;..if (result ==
0d30: 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74   NULL || Tcl_Get
0d40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d50: 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20  p, result, &ok) 
0d60: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
0d70: 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 20 20    ok = 1;..}.   
0d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72   } else {../* Er
0d90: 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65  ror - reject the
0da0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
0db0: 09 6f 6b 20 3d 20 30 3b 0a 23 69 66 20 28 54 43  .ok = 0;.#if (TC
0dc0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0dd0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0de0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0df0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e00: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0e10: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0e20: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0e30: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0e40: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0e50: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0e60: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0e80: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0e90: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0ea0: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0eb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0f00: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0f10: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0f20: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0f40: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0f60: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0f70: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0fd0: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0fe0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0ff0: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
1000: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
1010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
1020: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
1030: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
1040: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
1050: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
1060: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
1070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
1080: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a  r;.    char *maj
1090: 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b  or; char *minor;
10a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
10d0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10e0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10f0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
1100: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1110: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
1120: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
1130: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1140: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
1150: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1160: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
1170: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1180: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1190: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
11a0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
11b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
11c0: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
11d0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
11e0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
11f0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
1200: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1220: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
1230: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1240: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
1250: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
1280: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
1290: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
12a0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
12b0: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
12c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12d0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
12e0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
12f0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1300: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
1310: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
1320: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
1330: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1340: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1350: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
1360: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1370: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1380: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1390: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13d0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
13e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1400: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1410: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1420: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1430: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1440: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
1480: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
1490: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14d0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
14e0: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
14f0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1500: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1510: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1520: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1540: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1550: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1560: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1580: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15b0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15c0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
15e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1600: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1610: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1620: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1630: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1640: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1650: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1660: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1670: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
1680: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
1690: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16a0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16d0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
16e0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
16f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1700: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1710: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1770: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
1780: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
1790: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17d0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
17e0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1850: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1860: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1870: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
1880: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
1890: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18a0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18b0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18c0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18d0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
18e0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
18f0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1900: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1910: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1930: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1940: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1950: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1960: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1970: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
1980: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
1990: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19a0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19b0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19c0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19d0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
19e0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50  ersion) {.#if OP
19f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1a00: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1a10: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1a20: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1a40: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1a50: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1a60: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1a70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1a80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
1a90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1aa0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
1ab0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
1ac0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1ad0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
1ae0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1af0: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1b00: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1b10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1b20: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1b30: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1b40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b50: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1b60: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1b70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1b80: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1b90: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1ba0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1bb0: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 20 20  case 0:.        
1bc0: 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62  ver = "none";..b
1bd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1be0: 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f  t:..ver = "unkno
1bf0: 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  wn";..break;.   
1c00: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
1c10: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a  content_type) {.
1c20: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1c30: 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d  _HEADER:..type =
1c40: 20 22 48 65 61 64 65 72 22 3b 0a 20 20 20 20 20   "Header";.     
1c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c60: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52  se SSL3_RT_INNER
1c70: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09  _CONTENT_TYPE:..
1c80: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f  type = "Inner Co
1c90: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 20 20 20  ntent Type";.   
1ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1cc0: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1cd0: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1ce0: 20 43 69 70 68 65 72 22 3b 0a 20 20 20 20 20 20   Cipher";.      
1cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d00: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a  e SSL3_RT_ALERT:
1d10: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22  ..type = "Alert"
1d20: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d40: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1d50: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d70: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d80: 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41  T_APPLICATION_DA
1d90: 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70  TA:..type = "App
1da0: 20 44 61 74 61 22 3b 0a 20 20 20 20 20 20 20 20   Data";.        
1db0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1dc0: 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45  DTLS1_RT_HEARTBE
1dd0: 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  AT:..type = "Hea
1de0: 72 74 62 65 61 74 22 3b 0a 20 20 20 20 20 20 20  rtbeat";.       
1df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1e00: 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e  ult:..type = "un
1e10: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1e20: 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70     /* Needs comp
1e30: 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile time option 
1e40: 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63  "enable-ssl-trac
1e50: 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  e". */.    if ((
1e60: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio = BIO_new(BI
1e70: 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e  O_s_mem())) != N
1e80: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09  ULL) {..int n;..
1e90: 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f  SSL_trace(write_
1ea0: 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74  p, version, cont
1eb0: 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c  ent_type, buf, l
1ec0: 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a  en, ssl, (void *
1ed0: 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f  )bio);..n = BIO_
1ee0: 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72  read(bio, buffer
1ef0: 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 6e  , min(BIO_pendin
1f00: 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 3b  g(bio), 14999));
1f10: 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20  ..n = (n<0) ? 0 
1f20: 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20  : n;..buffer[n] 
1f30: 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f  = 0;..(void)BIO_
1f40: 66 6c 75 73 68 28 62 69 6f 29 3b 0a 20 09 42 49  flush(bio);. .BI
1f50: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20  O_free(bio);.   
1f60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
1f70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
1f80: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f90: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1fa0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1fb0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1fc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1fd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1fe0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1ff0: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2000: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2020: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2030: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
2040: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2050: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2060: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2070: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2090: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20b0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
20c0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2110: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2120: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2130: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2140: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2150: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
2160: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
21b0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
21c0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
21d0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
21e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
21f0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2200: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2210: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
2240: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
22a0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
22b0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
22c0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
22d0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
22e0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
22f0: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2300: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2310: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2320: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
2330: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
2340: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
2350: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
2360: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
2370: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2380: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2390: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
23a0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
23b0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
23c0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
23d0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
23e0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
23f0: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2400: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2410: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2420: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2430: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2440: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
2450: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
2460: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
2470: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2480: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
2490: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24a0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
24b0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
24c0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
24d0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
24e0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
24f0: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2500: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2520: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2530: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2540: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
2550: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
2560: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
2570: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2580: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
2590: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25a0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
25b0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
25c0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
25d0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
25e0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
25f0: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2600: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2610: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2620: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2630: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2640: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
2650: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
2660: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
2670: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2680: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
2690: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26a0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
26b0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
26c0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
26d0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
26e0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
26f0: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2700: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2710: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2720: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2740: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2750: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2760: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2770: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2780: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2790: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27a0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
27b0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2800: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2810: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2820: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2830: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2840: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2850: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
2860: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
2870: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2880: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
2890: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
28a0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
28b0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
28c0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
28d0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
28e0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
28f0: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2900: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2910: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
2920: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2930: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
2940: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
2950: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
2960: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
2970: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2980: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
2990: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
29a0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
29b0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
29c0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
29d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
29e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
29f0: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65  LL) {..if (state
2a00: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2a10: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2a20: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2a30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2a40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2a50: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2a60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2a70: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
2a80: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
2a90: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2aa0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
2ab0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
2ac0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2ad0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2ae0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2af0: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  j("verify", -1))
2b00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2b20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2b30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2b40: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2b50: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2b60: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2b70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b90: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2ba0: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20  ntObj(depth));. 
2bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f  rp, cmdPtr, Tls_
2be0: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
2bf0: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54  p, cert));.    T
2c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2c30: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20  ntObj(ok));.    
2c40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c50: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c60: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2c70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
2c80: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  *)X509_verify_ce
2c90: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
2ca0: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  err), -1));..   
2cb0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20   /* Prevent I/O 
2cc0: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69  while callback i
2cd0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f  s in progress */
2ce0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2cf0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2d00: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a  CL_CALLBACK; */.
2d10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
2d20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
2d30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2d40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2d50: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c     ok = EvalCall
2d60: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2d70: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2d80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2d90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
2da0: 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e     /* statePtr->
2db0: 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54  flags &= ~(TLS_T
2dc0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f  CL_CALLBACK); */
2dd0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29 3b  .    return(ok);
2de0: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  ./* By default, 
2df0: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69  leave verificati
2e00: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  on unchanged. */
2e10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2e60: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d  . * Tls_Error --
2e70: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  . *. *.Calls cal
2e80: 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74 20  lback with list 
2e90: 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20 2a  of errors.. *. *
2ea0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2eb0: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
2ec0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2ed0: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
2ee0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
2ef0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
2f00: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
2f10: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
2f20: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2f70: 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72   */.void.Tls_Err
2f80: 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  or(State *stateP
2f90: 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 7b  tr, char *msg) {
2fa0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
2fb0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
2fc0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
2fd0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c  Tcl_Obj *cmdPtr,
2fe0: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75   *listPtr;.    u
2ff0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72  nsigned long err
3000: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
3010: 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20  err = msg;..    
3020: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3030: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
3040: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
3050: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
3060: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
3070: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3080: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
3090: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
30a0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
30b0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
30c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
30d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
30e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
30f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65  _NewStringObj("e
3100: 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rror", -1));.   
3110: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3120: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3130: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
3140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3150: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
3160: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
3170: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66  f), -1));.    if
3180: 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b   (msg != NULL) {
3190: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
31a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
31b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
31c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c  ewStringObj(msg,
31d0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c   -1));..    } el
31e0: 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63  se if ((msg = Tc
31f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3200: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3210: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 4e 55 4c  ult(interp), NUL
3220: 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  L)) != NULL) {..
3230: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3240: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3250: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3260: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3270: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3280: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3290: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
32a0: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
32b0: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
32c0: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
32d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
32e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
32f0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
3300: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
3310: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
3320: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
3330: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
3340: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3350: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3360: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3370: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3380: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3390: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
33a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
33b0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
33c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
33d0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
33e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
33f0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
3400: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3450: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3460: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3470: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3480: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3490: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
34a0: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
34f0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
3500: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
3510: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
3520: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
3530: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
3540: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3550: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3560: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3570: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3580: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3590: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
35a0: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
35b0: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
35c0: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
35d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
3620: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
3630: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
3640: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3650: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b   for a private k
3660: 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69  ey loading/stori
3670: 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74  ng a PEM. *.cert
3680: 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63  ificate with enc
3690: 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63  ryption. Evals c
36a0: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61  allback script a
36b0: 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68  nd returns. *.th
36c0: 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  e result as the 
36d0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
36e0: 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65  in buf.. *. * Re
36f0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
3700: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3710: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
3720: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
3730: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  ). *. * Returns:
3740: 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a  . *.Password siz
3750: 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31  e in bytes or -1
3760: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
3770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
37c0: 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43  ic int.PasswordC
37d0: 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75  allback(char *bu
37e0: 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74  f, int size, int
37f0: 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75   rwflag, void *u
3800: 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74  data) {.    Stat
3810: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
3820: 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20  tate *) udata;. 
3830: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
3840: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
3850: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
3860: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
3870: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20     int code;..  
3880: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3890: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  d");..    /* If 
38a0: 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65  no callback, use
38b0: 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63   default callbac
38c0: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  k */.    if (sta
38d0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
38e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  == NULL) {..if (
38f0: 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72  Tcl_EvalEx(inter
3900: 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72  p, "tls::passwor
3910: 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c  d", -1, TCL_EVAL
3920: 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f  _GLOBAL) == TCL_
3930: 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  OK) {..    char 
3940: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
3950: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3960: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20  ult(interp);..  
3970: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72    strncpy(buf, r
3980: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a  et, (size_t) siz
3990: 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e);..    return 
39a0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29  (int)strlen(ret)
39b0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
39c0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
39d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
39e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
39f0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
3a00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3a10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70  eObj(statePtr->p
3a20: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63  assword);.    Tc
3a30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3a40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3a50: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3a60: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72  ringObj("passwor
3a70: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  d", -1));.    Tc
3a80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3a90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3aa0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3ab0: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20  tObj(rwflag));. 
3ac0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3ad0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3ae0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3af0: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29  NewIntObj(size))
3b00: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
3b10: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3b20: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63   interp);.    Tc
3b30: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
3b40: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
3b50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
3b60: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
3b70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
3b80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3b90: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
3ba0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
3bb0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
3bc0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
3bd0: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c   if (code != TCL
3be0: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f  _OK) {.#if (TCL_
3bf0: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
3c00: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
3c10: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
3c20: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
3c30: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c  ror(interp);.#el
3c40: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
3c50: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
3c60: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69  rp, code);.#endi
3c70: 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  f.    }.    Tcl_
3c80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
3c90: 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52  Ptr);..    Tcl_R
3ca0: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
3cb0: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
3cc0: 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73      /* If succes
3cd0: 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20  sful, pass back 
3ce0: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
3cf0: 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20  and truncate if 
3d00: 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20  too long */.    
3d10: 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f  if (code == TCL_
3d20: 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65 6e 3b 0a  OK) {..int len;.
3d30: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68  .char *ret = (ch
3d40: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72  ar *) Tcl_GetStr
3d50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47  ingFromObj(Tcl_G
3d60: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3d70: 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  rp), &len);..if 
3d80: 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31 29 20 7b  (len > size-1) {
3d90: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a 65  ..    len = size
3da0: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28  -1;..}..strncpy(
3db0: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
3dc0: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65  t) len);..buf[le
3dd0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f  n] = '\0';..Tcl_
3de0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3df0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72  ata) interp);..r
3e00: 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20 20 20 20  eturn(len);.    
3e10: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
3e20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3e30: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
3e40: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn -1;.}.../*. *
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f  ---. *. * Sessio
3ea0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  n Callback for C
3eb0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
3ec0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  Called when a ne
3ed0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64  w session is add
3ee0: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e  ed to the cache.
3ef0: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74   In TLS 1.3. *.t
3f00: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69  his may be recei
3f10: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ved multiple tim
3f20: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e  es after the han
3f30: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65  dshake. For. *.e
3f40: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c  arlier versions,
3f50: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
3f60: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68  ceived during th
3f70: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
3f80: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66  This is the pref
3f90: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74  erred way to obt
3fa0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20  ain a resumable 
3fb0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  session.. *. * R
3fc0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3fd0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3fe0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3ff0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4000: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4010: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72  codes:. *.0 = er
4020: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f  ror where sessio
4030: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69  n will be immedi
4040: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72  ately removed fr
4050: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
4060: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75  cache.. *.1 = su
4070: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20  ccess where app 
4080: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20  retains session 
4090: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65  in session cache
40a0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20  , and must call 
40b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65  SSL_SESSION_free
40c0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a  () when done.. *
40d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4120: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c  c int.SessionCal
4130: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
4140: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
4150: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
4160: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4170: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
4180: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
4190: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
41a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
41b0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
41c0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
41d0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
41e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
41f0: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4200: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4210: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4220: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
4230: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
4240: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
4250: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4260: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4270: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
4280: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
4290: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
42a0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
42b0: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
42c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
42d0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
42e0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
42f0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4300: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4310: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4320: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4330: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
4340: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4360: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4380: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29  ("session", -1))
4390: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
43a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
43b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
43c0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
43d0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
43e0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
43f0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a  ->self), -1));..
4400: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
4410: 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  d */.    session
4420: 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
4430: 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
4440: 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63  , &ulen);.    Tc
4450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4470: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  mdPtr, Tcl_NewBy
4480: 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69  teArrayObj(sessi
4490: 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65  on_id, (int) ule
44a0: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73  n));..    /* Ses
44b0: 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20  sion ticket */. 
44c0: 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67     SSL_SESSION_g
44d0: 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
44e0: 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
44f0: 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  n2);.    Tcl_Lis
4500: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4510: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4520: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
4530: 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 69  ayObj(ticket, (i
4540: 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20  nt) len2));..   
4550: 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e   /* Lifetime - n
4560: 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
4570: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74   */.    Tcl_List
4580: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4590: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
45a0: 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a  ..Tcl_NewLongObj
45b0: 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53  ((long) SSL_SESS
45c0: 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c  ION_get_ticket_l
45d0: 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73  ifetime_hint(ses
45e0: 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a  sion)));..    /*
45f0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
4600: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
4610: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
4620: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
4630: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
4640: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
4650: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
4660: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
4670: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
4680: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
46d0: 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b   * ALPN Callback
46e0: 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64   for Servers and
46f0: 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f   NPN Callback fo
4700: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a  r Clients --. *.
4710: 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f   *.Perform proto
4720: 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68  col (http/1.1, h
4730: 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c  2, h3, etc.) sel
4740: 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20  ection for the. 
4750: 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65  *.incoming conne
4760: 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66  ction. Called af
4770: 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65  ter Hello and se
4780: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  rver callbacks..
4790: 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69   *.Where 'out' i
47a0: 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  s selected proto
47b0: 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20  col and 'in' is 
47c0: 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69  the peer adverti
47d0: 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  sed list.. *. * 
47e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
47f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4800: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
4810: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
4820: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
4830: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54   codes:. *.SSL_T
4840: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c  LSEXT_ERR_OK: AL
4850: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  PN protocol sele
4860: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
4870: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
4880: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
4890: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54  R_ALERT_FATAL: T
48a0: 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72  here was no over
48b0: 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20  lap between the 
48c0: 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20  client's. *.    
48d0: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e  supplied list an
48e0: 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e  d the server con
48f0: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20  figuration. The 
4900: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
4910: 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53  be aborted.. *.S
4920: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4930: 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63  ACK: ALPN protoc
4940: 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c  ol not selected,
4950: 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e   e.g., because n
4960: 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72  o ALPN. *.    pr
4970: 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66  otocols are conf
4980: 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20  igured for this 
4990: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
49a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
49b0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4a00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c  */.static int.AL
4a10: 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  PNCallback(const
4a20: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
4a30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4a40: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  *out, unsigned c
4a50: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f  har *outlen,..co
4a60: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4a70: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r *in, unsigned 
4a80: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20  int inlen, void 
4a90: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4aa0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4ab0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4ac0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4ad0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4ae0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4af0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4b00: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20  nt code, res;.. 
4b10: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4b20: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4b30: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4b40: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4b50: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4b60: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4b70: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
4b80: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
4b90: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e  if (SSL_select_n
4ba0: 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f  ext_proto(out, o
4bb0: 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d  utlen, statePtr-
4bc0: 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74  >protos, statePt
4bd0: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09  r->protos_len,..
4be0: 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50  in, inlen) == OP
4bf0: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49  ENSSL_NPN_NEGOTI
4c00: 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63  ATED) {../* Matc
4c10: 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20  h found */..res 
4c20: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4c30: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4c40: 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50  {../* OPENSSL_NP
4c50: 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e  N_NO_OVERLAP = N
4c60: 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73  o overlap, so us
4c70: 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f  e first item fro
4c80: 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f  m client protoco
4c90: 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d  l list */..res =
4ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4cb0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4cc0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
4cd0: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
4ce0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
4cf0: 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  n res;.    }..  
4d00: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
4d10: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
4d20: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
4d30: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
4d40: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
4d50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4d60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4d70: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4d80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
4d90: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
4da0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4db0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4dc0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
4dd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
4de0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
4df0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
4e00: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
4e10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4e20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4e30: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4e40: 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b  gObj(*out, -1));
4e50: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4e60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4e70: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4e80: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
4e90: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58  res == SSL_TLSEX
4ea0: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20  T_ERR_OK));..   
4eb0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
4ec0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
4ed0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4ee0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
4ef0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
4f00: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
4f10: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
4f20: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
4f30: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4f40: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  NOACK;.    } els
4f50: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
4f60: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
4f70: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4f80: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
4f90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4fa0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20  ALERT_FATAL;.   
4fb0: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
4fc0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
4fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
4fe0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5030: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72  . * Advertise Pr
5040: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b  otocols Callback
5050: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63   for Next Protoc
5060: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28  ol Negotiation (
5070: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65  NPN) in ServerHe
5080: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c  llo --. *. *.cal
5090: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73  led when a TLS s
50a0: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69  erver needs a li
50b0: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20  st of supported 
50c0: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65  protocols for Ne
50d0: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e  xt. *.Protocol N
50e0: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20  egotiation.. *. 
50f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
5100: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
5110: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74  fects:. *. * Ret
5120: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
5130: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
5140: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65   NPN protocol se
5150: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
5160: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5170: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5180: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70  ERR_NOACK: NPN p
5190: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65  rotocol not sele
51a0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
51b0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
51c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66  --------. */.#if
5210: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74  def USE_NPN.stat
5220: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61  ic int.NPNCallba
5230: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
5240: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
5250: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
5260: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c  signed int *outl
5270: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
5280: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5290: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
52a0: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  rg;..    dprintf
52b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
52c0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
52d0: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
52e0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
52f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5300: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
5310: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  et protocols lis
5320: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
5330: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
5340: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d   NULL) {..*out =
5350: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
5360: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74  s;..*outlen = st
5370: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
5380: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  en;.    } else {
5390: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09  ..*out = NULL;..
53a0: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65  *outlen = 0;..re
53b0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
53c0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
53d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f  .    return SSL_
53e0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d  TLSEXT_ERR_OK;.}
53f0: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5440: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c  --. *. * SNI Cal
5450: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
5460: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
5470: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53  rm server-side S
5480: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65  NI hostname sele
5490: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65  ction after rece
54a0: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73  iving SNI extens
54b0: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74  ion. *.in Client
54c0: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61   Hello. Called a
54d0: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62  fter hello callb
54e0: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41  ack but before A
54f0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  LPN callback.. *
5500: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5510: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
5520: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
5530: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
5540: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
5550: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5560: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5570: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5580: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  s accepted. The 
5590: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
55a0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
55b0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
55c0: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  TAL: SNI hostnam
55d0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
55e0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
55f0: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72  n. *.    is abor
5600: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72  ted. Default for
5610: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44   alert is SSL_AD
5620: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41  _UNRECOGNIZED_NA
5630: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ME.. *.SSL_TLSEX
5640: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e  T_ERR_ALERT_WARN
5650: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ING: SNI hostnam
5660: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
5670: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74  d, warning alert
5680: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f  . *.    sent (no
5690: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54  t supported in T
56a0: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e  LSv1.3). The con
56b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
56c0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
56d0: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20  _ERR_NOACK: SNI 
56e0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20  hostname is not 
56f0: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74  accepted and not
5700: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20   acknowledged,. 
5710: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e  *.    e.g. if SN
5720: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  I has not been c
5730: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63  onfigured. The c
5740: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5750: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
57a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49  /.static int.SNI
57b0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
57c0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
57d0: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
57e0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
57f0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
5800: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
5810: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
5820: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
5830: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
5840: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
5850: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68 61 72  e, res;.    char
5860: 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e   *servername = N
5870: 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ULL;..    dprint
5880: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
5890: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
58a0: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
58b0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
58c0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
58d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
58e0: 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54  Only works for T
58f0: 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69  LS 1.2 and earli
5900: 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72  er */.    server
5910: 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73  name = SSL_get_s
5920: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54  ervername(ssl, T
5930: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
5940: 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69  ost_name);.    i
5950: 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c  f (!servername |
5960: 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20  | servername[0] 
5970: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75  == '\0') {..retu
5980: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5990: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
59a0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
59b0: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
59c0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
59d0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
59e0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  RR_OK;.    }..  
59f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
5a00: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
5a10: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5a20: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5a30: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5a40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5a50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5a60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5a70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69  ewStringObj("sni
5a80: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
5a90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5aa0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5ab0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
5ac0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
5ad0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
5ae0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
5af0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5b00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5b10: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5b20: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5b30: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c  Obj(servername ,
5b40: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45   -1));..    /* E
5b50: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
5b60: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
5b70: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
5b80: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
5b90: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
5ba0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
5bb0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
5bc0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5bd0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5be0: 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72  _WARNING;..*aler
5bf0: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43  t = SSL_AD_UNREC
5c00: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a  OGNIZED_NAME; /*
5c10: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   Not supported b
5c20: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  y TLS 1.3 */.   
5c30: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5c40: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
5c50: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5c60: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
5c70: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5c80: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
5c90: 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  L;..*alert = SSL
5ca0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5cb0: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5cc0: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5cd0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  .3 */.    }.    
5ce0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5cf0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5d00: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5d10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69  ------. *. * Cli
5d60: 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61  entHello Handsha
5d70: 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ke Callback for 
5d80: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
5d90: 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20  .Used by server 
5da0: 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73  to examine the s
5db0: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63  erver name indic
5dc0: 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65  ation (SNI) exte
5dd0: 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65  nsion. *.provide
5de0: 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20  d by the client 
5df0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65  in order to sele
5e00: 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ct an appropriat
5e10: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  e certificate to
5e20: 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64  . *.present, and
5e30: 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66   make other conf
5e40: 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74  iguration adjust
5e50: 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74  ments relevant t
5e60: 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a  o that server. *
5e70: 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f  .name and its co
5e80: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69  nfiguration. Thi
5e90: 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70  s includes swapp
5ea0: 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f  ing out the asso
5eb0: 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54  ciated. *.SSL_CT
5ec0: 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66  X pointer, modif
5ed0: 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27  ying the server'
5ee0: 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74  s list of permit
5ef0: 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73  ted TLS versions
5f00: 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68  ,. *.changing th
5f10: 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65  e server's ciphe
5f20: 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e  r list in respon
5f30: 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  se to the client
5f40: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20  's cipher list, 
5f50: 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62  etc.. *.Called b
5f60: 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c  efore SNI and AL
5f70: 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a  PN callbacks.. *
5f80: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5f90: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
5fa0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
5fb0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
5fc0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
5fd0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5fe0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
5ff0: 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74  RETRY: suspend t
6000: 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e  he handshake, an
6010: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  d the handshake 
6020: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
6030: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
6040: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
6050: 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c  ELLO_ERROR: fail
6060: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63  ure, terminate c
6070: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61  onnection. Set a
6080: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f  lert to error co
6090: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  de.. *.SSL_CLIEN
60a0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a  T_HELLO_SUCCESS:
60b0: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d   success. *. *--
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
6110: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63  .HelloCallback(c
6120: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69  onst SSL *ssl, i
6130: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20  nt *alert, void 
6140: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
6150: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
6160: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
6170: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6180: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
6190: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
61a0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
61b0: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20  nt code, res;.  
61c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
61d0: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  rvername;.    co
61e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
61f0: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74  r *p;.    size_t
6200: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b   len, remaining;
6210: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
6220: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
6230: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
6240: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
6250: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
6260: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
6270: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c  UCCESS;.    } el
6280: 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55  se if (ssl == NU
6290: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
62a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
62b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
62c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
62d0: 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a  /* Get names */.
62e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69      if (!SSL_cli
62f0: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65  ent_hello_get0_e
6300: 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54  xt(ssl, TLSEXT_T
6310: 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c  YPE_server_name,
6320: 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29   &p, &remaining)
6330: 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d   || remaining <=
6340: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
6350: 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52  SSL_R_SSLV3_ALER
6360: 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45  T_ILLEGAL_PARAME
6370: 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  TER;..return SSL
6380: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6390: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
63a0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c  /* Extract the l
63b0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70  ength of the sup
63c0: 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61  plied list of na
63d0: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  mes. */.    len 
63e0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
63f0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6400: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6410: 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67  + 2 != remaining
6420: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6430: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6440: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
6450: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6460: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6470: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  R;.    }.    rem
6480: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20  aining = len;.. 
6490: 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
64a0: 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20  n practice only 
64b0: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  has a single ele
64c0: 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79  ment, so we only
64d0: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69   consider the fi
64e0: 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  rst one. */.    
64f0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  if (remaining ==
6500: 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c   0 || *p++ != TL
6510: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
6520: 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65  st_name) {..*ale
6530: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6540: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6550: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6560: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6570: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6580: 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20   remaining--;.. 
6590: 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e     /* Now we can
65a0: 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75   finally pull ou
65b0: 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79  t the byte array
65c0: 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c   with the actual
65d0: 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20   hostname. */.  
65e0: 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20    if (remaining 
65f0: 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20  <= 2) {..*alert 
6600: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6610: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6620: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6630: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6640: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  OR;.    }.    le
6650: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38  n = (*(p++) << 8
6660: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28  );.    len += *(
6670: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  p++);.    if (le
6680: 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e  n + 2 > remainin
6690: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  g) {..*alert = S
66a0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
66b0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
66c0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
66d0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
66e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
66f0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  ning = len;.    
6700: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f  servername = (co
6710: 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20  nst char *)p;.. 
6720: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
6730: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
6740: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
6750: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
6760: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
6770: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6780: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6790: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
67a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65  NewStringObj("he
67b0: 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  llo", -1));.    
67c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
67d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
67e0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
67f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
6800: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
6810: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
6820: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
6830: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6840: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6850: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
6860: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d  ingObj(servernam
6870: 65 2c 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a  e, (int) len));.
6880: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
6890: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
68a0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
68b0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
68c0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
68d0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
68e0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
68f0: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
6900: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6910: 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61  HELLO_RETRY;..*a
6920: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6930: 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41  V1_ALERT_USER_CA
6940: 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65  NCELLED;.    } e
6950: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
6960: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6970: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6980: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
6990: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
69a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
69b0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
69c0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
69d0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20  TERNAL_ERROR;.  
69e0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
69f0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6a00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
6a10: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
6a30: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20  Commands        
6a40: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
6a60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65  ----. *. * Ciphe
6ab0: 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74  rsObjCmd -- list
6ac0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
6ad0: 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  rs. *. *.This pr
6ae0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
6af0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
6b00: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  e "tls::ciphers"
6b10: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
6b20: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69  ist available ci
6b30: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f  phers, based upo
6b40: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  n protocol selec
6b50: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ted.. *. * Resul
6b60: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
6b70: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73  d Tcl result lis
6b80: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
6b90: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
6ba0: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79  ucts and destroy
6bb0: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
6bc0: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6c10: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6c20: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20  ar *protocols[] 
6c30: 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73 73  = {.."ssl2", "ss
6c40: 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c  l3", "tls1", "tl
6c50: 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c  s1.1", "tls1.2",
6c60: 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a   "tls1.3", NULL.
6c70: 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c  };.enum protocol
6c80: 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c   {.    TLS_SSL2,
6c90: 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54   TLS_SSL3, TLS_T
6ca0: 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c  LS1, TLS_TLS1_1,
6cb0: 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53   TLS_TLS1_2, TLS
6cc0: 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e  _TLS1_3, TLS_NON
6cd0: 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  E.};..static int
6ce0: 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43  .CiphersObjCmd(C
6cf0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
6d00: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
6d10: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
6d20: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
6d30: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
6d40: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
6d50: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
6d60: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
6d70: 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d  ;.    SSL *ssl =
6d80: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b   NULL;.    STACK
6d90: 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20  _OF(SSL_CIPHER) 
6da0: 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  *sk;.    char *c
6db0: 70 2c 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  p, buf[BUFSIZ];.
6dc0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
6dd0: 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f  erbose = 0, use_
6de0: 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a  supported = 0;..
6df0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6e00: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
6e10: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f  (objc < 2) || (o
6e20: 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c  bjc > 4)) {..Tcl
6e30: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6e40: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6e50: 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73  protocol ?verbos
6e60: 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29  e? ?supported?")
6e70: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6e80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
6e90: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
6ea0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6eb0: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
6ec0: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
6ed0: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
6ee0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6ef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6f00: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
6f10: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  2) && Tcl_GetBoo
6f20: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
6f30: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65  rp, objv[2], &ve
6f40: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  rbose) != TCL_OK
6f50: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
6f60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6f70: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20   if ((objc > 3) 
6f80: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  && Tcl_GetBoolea
6f90: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
6fa0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73   objv[3], &use_s
6fb0: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c  upported) != TCL
6fc0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
6fd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6fe0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
6ff0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69  rror();..    swi
7000: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f  tch ((enum proto
7010: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61  col)index) {..ca
7020: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66  se TLS_SSL2:.#if
7030: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
7040: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
7050: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
7060: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
7070: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7080: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f  _SSL2)..    Tcl_
7090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
70a0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
70b0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
70c0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
70d0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
70e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
70f0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20  .#else..    ctx 
7100: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53  = SSL_CTX_new(SS
7110: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62  Lv2_method()); b
7120: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7130: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
7140: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
7150: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7160: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
7170: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7180: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7190: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
71a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
71b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
71c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
71d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
71e0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
71f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7200: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
7210: 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65  CTX_new(SSLv3_me
7220: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
7230: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
7240: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
7250: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
7260: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7270: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
7280: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7290: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  S1_METHOD)..    
72a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
72b0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
72c0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
72d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
72e0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
72f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7300: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7310: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
7320: 77 28 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29  w(TLSv1_method()
7330: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
7340: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
7350: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
7360: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
7370: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7380: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7390: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
73a0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_1_METHOD)..  
73b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
73c0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
73d0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
73e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
73f0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7400: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7410: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7420: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
7430: 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65 74 68  new(TLSv1_1_meth
7440: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
7450: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7460: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_2:.#if defin
7470: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
7480: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7490: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  _NO_TLS1_2) || d
74a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
74b0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
74c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
74d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
74e0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
74f0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
7500: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
7510: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
7520: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7530: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
7540: 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f  CTX_new(TLSv1_2_
7550: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
7560: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
7570: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64  LS_TLS1_3:.#if d
7580: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
7590: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
75a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
75b0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
75c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
75d0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
75e0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
75f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7600: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7610: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7620: 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
7630: 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f  TX_new(TLS_metho
7640: 64 28 29 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  d());..    SSL_C
7650: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
7660: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
7670: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
7680: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7690: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
76a0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
76b0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65  RSION);..    bre
76c0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61  ak;.#endif..defa
76d0: 75 6c 74 3a 0a 09 20 20 20 20 62 72 65 61 6b 3b  ult:..    break;
76e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63  .    }.    if (c
76f0: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  tx == NULL) {..T
7700: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7710: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29  interp, REASON()
7720: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
7730: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7740: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c  }..    ssl = SSL
7750: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69  _new(ctx);.    i
7760: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
7770: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7780: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
7790: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53  ON(), NULL);..SS
77a0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
77b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
77c0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
77d0: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f  * Use list and o
77e0: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65  rder as would be
77f0: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e   sent in a Clien
7800: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76  tHello or all av
7810: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20  ailable ciphers 
7820: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73  */.    if (use_s
7830: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20  upported) {..sk 
7840: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f  = SSL_get1_suppo
7850: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c  rted_ciphers(ssl
7860: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
7870: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69  .sk = SSL_get_ci
7880: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7890: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d  }..    if (sk !=
78a0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76   NULL) {..if (!v
78b0: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f  erbose) {..    o
78c0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
78d0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
78e0: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
78f0: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
7900: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
7910: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
7920: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
7930: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
7940: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
7950: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
7960: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70  tinue;..../* cip
7970: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e  her name or (NON
7980: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c  E) */...cp = SSL
7990: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
79a0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d  (c);...if (cp ==
79b0: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09   NULL) break;...
79c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
79d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
79e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
79f0: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31  StringObj(cp, -1
7a00: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65  ));..    }...} e
7a10: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74  lse {..    objPt
7a20: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
7a30: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20  gObj("",0);..   
7a40: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7a50: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7a60: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7a70: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7a80: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7a90: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7aa0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7ab0: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7ac0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20  ;..../* textual 
7ad0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
7ae0: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69  he cipher */...i
7af0: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
7b00: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66  scription(c, buf
7b10: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21  , sizeof(buf)) !
7b20: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  = NULL) {...    
7b30: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
7b40: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 69 6e  objPtr, buf, (in
7b50: 74 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b  t) strlen(buf));
7b60: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
7b70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
7b80: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f  j(objPtr, "UNKNO
7b90: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09  WN\n", 8);...}..
7ba0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73      }..}..if (us
7bb0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
7bc0: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45      sk_SSL_CIPHE
7bd0: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20  R_free(sk);..}. 
7be0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65     }.    SSL_fre
7bf0: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f  e(ssl);.    SSL_
7c00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a  CTX_free(ctx);..
7c10: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7c20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
7c30: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
7c40: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
7c50: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
7c60: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  a;.}.../*. *----
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7cb0: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f   *. * ProtocolsO
7cc0: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76  bjCmd -- list av
7cd0: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  ailable protocol
7ce0: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  s. *. *.This pro
7cf0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
7d00: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
7d10: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73   "tls::protocols
7d20: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
7d30: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70  list available p
7d40: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20  rotocols.. *. * 
7d50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
7d60: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
7d70: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
7d80: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
7d90: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
7de0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74  .static int.Prot
7df0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65  ocolsObjCmd(Clie
7e00: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
7e10: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
7e20: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
7e30: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
7e40: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
7e50: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
7e60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
7e70: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
7e80: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63  objc != 1) {..Tc
7e90: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7ea0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7eb0: 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  "");..return TCL
7ec0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7ed0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
7ee0: 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  or();..    objPt
7ef0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
7f00: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69  bj(0, NULL);..#i
7f10: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7f20: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
7f30: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
7f40: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
7f50: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7f60: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c  NO_SSL2).    Tcl
7f70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7f80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
7f90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
7fa0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
7fb0: 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29  [TLS_SSL2], -1))
7fc0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
7fd0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
7fe0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
7ff0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
8000: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8010: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
8020: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8030: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8040: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8050: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8060: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33  otocols[TLS_SSL3
8070: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8080: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8090: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
80a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
80b0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
80c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
80d0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
80e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
80f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8100: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8110: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8120: 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a  LS_TLS1], -1));.
8130: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8140: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
8150: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8160: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  SL_NO_TLS1_1) &&
8170: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8180: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
8190: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
81a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
81b0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
81c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
81d0: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
81e0: 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_1], -1));.#
81f0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
8200: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
8210: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8220: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  L_NO_TLS1_2) && 
8230: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8240: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f  _NO_TLS1_2_METHO
8250: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8260: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8270: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8280: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8290: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
82a0: 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_2], -1));.#e
82b0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
82c0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
82d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
82e0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
82f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8300: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8310: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8320: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8330: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c  ols[TLS_TLS1_3],
8340: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   -1));.#endif.. 
8350: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
8360: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
8370: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
8380: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
8390: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
83a0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
83b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
83f0: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62  *. * HandshakeOb
8400: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
8410: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
8420: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65  ed to verify whe
8430: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  ther the handsha
8440: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20  ke is complete. 
8450: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20  *.or not.. *. * 
8460: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
8470: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
8480: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73  t. 1 means hands
8490: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30  hake complete, 0
84a0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a   means pending..
84b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
84c0: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65  ts:. *.May force
84d0: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
84e0: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a   to take place..
84f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8530: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8540: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b  tic int Handshak
8550: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  eObjCmd(ClientDa
8560: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
8570: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8580: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
8590: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
85a0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
85b0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20  annel chan;     
85c0: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65     /* The channe
85d0: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
85e0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
85f0: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20   *statePtr;     
8600: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61     /* client sta
8610: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
8620: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  t */.    const c
8630: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55  har *errStr = NU
8640: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20  LL;.    int ret 
8650: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  = 1;.    int err
8660: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
8670: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
8680: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
8690: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
86a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
86b0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
86c0: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
86d0: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
86e0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
86f0: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
8700: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
8710: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8720: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8730: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c  v[1], NULL), NUL
8740: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
8750: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
8760: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
8770: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
8780: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
8790: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
87a0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
87b0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
87c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
87d0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
87e0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
87f0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
8800: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
8810: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
8820: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8830: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
8840: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
8850: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
8860: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
8870: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
8880: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8890: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
88a0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
88b0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
88c0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
88d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54  NULL);..return(T
88e0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
88f0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
8900: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
8910: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
8920: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
8930: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
8940: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
8950: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d  ect");.    ret =
8960: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
8970: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65  ect(statePtr, &e
8980: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69  rr, 1);.    dpri
8990: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72  ntf("Tls_WaitFor
89a0: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64  Connect returned
89b0: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20  : %i", ret);..  
89c0: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26    if (ret < 0 &&
89d0: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61   ((statePtr->fla
89e0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59  gs & TLS_TCL_ASY
89f0: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45  NC) && (err == E
8a00: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69  AGAIN))) {..dpri
8a10: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61  ntf("Async set a
8a20: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22  nd err = EAGAIN"
8a30: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20  );..ret = 0;.   
8a40: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20   } else if (ret 
8a50: 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 20 3d  < 0) {..errStr =
8a60: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a   statePtr->err;.
8a70: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74  .Tcl_ResetResult
8a80: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53  (interp);..Tcl_S
8a90: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09  etErrno(err);...
8aa0: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28  if (!errStr || (
8ab0: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b  *errStr == 0)) {
8ac0: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54  ..    errStr = T
8ad0: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  cl_PosixError(in
8ae0: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  terp);..}...Tcl_
8af0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8b00: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20  erp, "handshake 
8b10: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74  failed: ", errSt
8b20: 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  r, (char *) NULL
8b30: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8b40: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8b50: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8b60: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
8b70: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69   *) NULL);..dpri
8b80: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
8b90: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61  CL_ERROR with ha
8ba0: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
8bb0: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72  %s", errStr);..r
8bc0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
8bd0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
8be0: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a  if (err != 0) {.
8bf0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
8c00: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20  t an error with 
8c10: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64  a completed hand
8c20: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22  shake: err = %i"
8c30: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20  , err);..}..ret 
8c40: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
8c50: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
8c60: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64  ng TCL_OK with d
8c70: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74  ata \"%i\"", ret
8c80: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
8c90: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8ca0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
8cb0: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  t));.    return(
8cc0: 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74  TCL_OK);..client
8cd0: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
8ce0: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  a;.}../*. *-----
8cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8d30: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  *. * ImportObjCm
8d40: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
8d50: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
8d60: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
8d70: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e  the "ssl" comman
8d80: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20  d. *. *.The ssl 
8d90: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53  command pushes S
8da0: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79  SL over a (newly
8db0: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20   connected) tcp 
8dc0: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73  socket. *. * Res
8dd0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
8de0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
8df0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8e00: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
8e10: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
8e20: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
8e30: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
8e80: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f  atic int.ImportO
8e90: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
8ea0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
8eb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8ec0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
8ed0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8ee0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
8ef0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
8f00: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
8f10: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
8f20: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
8f30: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
8f40: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
8f50: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
8f60: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20  TX *ctx.        
8f70: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
8f80: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20  Obj *script.    
8f90: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8fa0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72  Tcl_Obj *passwor
8fb0: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
8fc0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  ;.    Tcl_Obj *v
8fd0: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55  cmd.        = NU
8fe0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
8ff0: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
9000: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
9010: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
9020: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
9030: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
9040: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
9050: 20 20 69 6e 74 20 69 64 78 2c 20 6c 65 6e 3b 0a    int idx, len;.
9060: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20      int flags.. 
9070: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c         = TLS_TCL
9080: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
9090: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d  erver..        =
90a0: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63   0;./* is connec
90b0: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72  tion incoming or
90c0: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20   outgoing? */.  
90d0: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09    char *keyfile.
90e0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
90f0: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69      char *certfi
9100: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
9110: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
9120: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55  char *key  .= NU
9130: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f  LL;.    int key_
9140: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  len             
9150: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73      = 0;.    uns
9160: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
9170: 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b           = NULL;
9180: 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65  .    int cert_le
9190: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
91a0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
91b0: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
91c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
91d0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20   *ciphersuites. 
91e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
91f0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09     char *CAfile.
9200: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9210: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
9220: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9230: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
9240: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ams.        = NU
9250: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
9260: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e  del..        = N
9270: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ULL;.    char *s
9280: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20  ervername.      
9290: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73    = NULL;./* hos
92a0: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
92b0: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
92c0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
92d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
92e0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a  sion_id = NULL;.
92f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70      Tcl_Obj *alp
9300: 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  n..= NULL;.    i
9310: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c  nt ssl2 = 0, ssl
9320: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  3 = 0;.    int t
9330: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20  ls1 = 1, tls1_1 
9340: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c  = 1, tls1_2 = 1,
9350: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20   tls1_3 = 1;.   
9360: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20   int proto = 0, 
9370: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
9380: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
9390: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
93a0: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68  uest = 1, post_h
93b0: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20  andshake = 0;.. 
93c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
93d0: 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ed");..#if OPENS
93e0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
93f0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
9400: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
9410: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26 20  SSL_NO_SSL2) && 
9420: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
9430: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
9440: 53 53 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64  SSL3) && defined
9450: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65 66  (NO_TLS1) && def
9460: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
9470: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
9480: 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65 64  S1_2) && defined
9490: 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  (NO_TLS1_3).    
94a0: 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ssl2 = 1;.#endif
94b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50  .#if !defined(OP
94c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
94d0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
94e0: 4c 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  L3) && defined(N
94f0: 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e  O_SSL2) && defin
9500: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64  ed(NO_TLS1) && d
9510: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
9520: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
9530: 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e  TLS1_2) && defin
9540: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  ed(NO_TLS1_3).  
9550: 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64    ssl3 = 1;.#end
9560: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
9570: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
9580: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9590: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30  S1).    tls1 = 0
95a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
95b0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
95c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
95d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
95e0: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65    tls1_1 = 0;.#e
95f0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
9600: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
9610: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9620: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c  O_TLS1_2).    tl
9630: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_2 = 0;.#endif
9640: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
9650: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
9660: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9670: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33  S1_3).    tls1_3
9680: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
9690: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
96a0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
96b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
96c0: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f  bjv, "channel ?o
96d0: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75  ptions?");..retu
96e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
96f0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
9700: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
9710: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
9720: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
9730: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9740: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
9750: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
9760: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
9770: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9780: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9790: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
97a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
97b0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
97c0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
97d0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
97e0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
97f0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
9800: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
9810: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
9820: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
9830: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
9840: 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b  bjv[idx], NULL);
9850: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
9860: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
9870: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70  ;...OPTOBJ("-alp
9880: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53  n", alpn);..OPTS
9890: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64  TR("-cadir", CAd
98a0: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  ir);..OPTSTR("-c
98b0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
98c0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74  ..OPTBYTE("-cert
98d0: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65  ", cert, cert_le
98e0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65  n);..OPTSTR("-ce
98f0: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c  rtfile", certfil
9900: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  e);..OPTSTR("-ci
9910: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b  pher", ciphers);
9920: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
9930: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  rs", ciphers);..
9940: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9950: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75  uites", ciphersu
9960: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  ites);..OPTOBJ("
9970: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70  -command", scrip
9980: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68  t);..OPTSTR("-dh
9990: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d  params", DHparam
99a0: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b  s);..OPTBYTE("-k
99b0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  ey", key, key_le
99c0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65  n);..OPTSTR("-ke
99d0: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29  yfile", keyfile)
99e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65  ;..OPTSTR("-mode
99f0: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54  l", model);..OPT
9a00: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c  OBJ("-password",
9a10: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54   password);..OPT
9a20: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64  BOOL("-post_hand
9a30: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e  shake", post_han
9a40: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f  dshake);..OPTBOO
9a50: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65  L("-request", re
9a60: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quest);..OPTBOOL
9a70: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
9a80: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22  uire);..OPTINT("
9a90: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c  -securitylevel",
9aa0: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9ab0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9ac0: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9ad0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9ae0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9af0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9b00: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9b10: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9b20: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9b30: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9b40: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9b50: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9b60: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9b70: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9b80: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9b90: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9ba0: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9bb0: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9bc0: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9bd0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9be0: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9bf0: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9c00: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9c10: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
9c20: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
9c30: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c  , -ciphersuites,
9c40: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61   -command, -dhpa
9c50: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79  rams, -key, -key
9c60: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70  file, -model, -p
9c70: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68  assword, -post_h
9c80: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65  andshake, -reque
9c90: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73  st, -require, -s
9ca0: 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73  ecuritylevel, -s
9cb0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
9cc0: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c  me, -session_id,
9cd0: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d   -ssl2, -ssl3, -
9ce0: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d  tls1, -tls1.1, -
9cf0: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c  tls1.2, -tls1.3,
9d00: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d   or -validatecom
9d10: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  mand");...return
9d20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9d30: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
9d40: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53  t)..verify |= SS
9d50: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
9d60: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46  ONCE | SSL_VERIF
9d70: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28  Y_PEER;.    if (
9d80: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69  request && requi
9d90: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  re).verify |= SS
9da0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
9db0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20  _NO_PEER_CERT;. 
9dc0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
9dd0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
9de0: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ).verify |= SSL_
9df0: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
9e00: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76  SHAKE;.    if (v
9e10: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72  erify == 0)..ver
9e20: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59  ify = SSL_VERIFY
9e30: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74  _NONE;..    prot
9e40: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53  o |= (ssl2 ? TLS
9e50: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29  _PROTO_SSL2 : 0)
9e60: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9e70: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl3 ? TLS_PROTO
9e80: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL3 : 0);.    
9e90: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f  proto |= (tls1 ?
9ea0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20   TLS_PROTO_TLS1 
9eb0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9ec0: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53  |= (tls1_1 ? TLS
9ed0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20  _PROTO_TLS1_1 : 
9ee0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9ef0: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50   (tls1_2 ? TLS_P
9f00: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29  ROTO_TLS1_2 : 0)
9f10: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9f20: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f  tls1_3 ? TLS_PRO
9f30: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a  TO_TLS1_3 : 0);.
9f40: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f  .    /* reset to
9f50: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73   NULL if blank s
9f60: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a  tring provided *
9f70: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26  /.    if (cert &
9f80: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20  & !*cert)..     
9f90: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20     cert.        
9fa0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9fb0: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20  key && !*key).. 
9fc0: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20         key.     
9fd0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9fe0: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21  f (certfile && !
9ff0: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20  *certfile)      
a000: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55     certfile.= NU
a010: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66  LL;.    if (keyf
a020: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65  ile && !*keyfile
a030: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20  )..keyfile.     
a040: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a050: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
a060: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20  ciphers).       
a070: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20   ciphers.       
a080: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a090: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26  (ciphersuites &&
a0a0: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29   !*ciphersuites)
a0b0: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20   ciphersuites   
a0c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a0d0: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66  (CAfile && !*CAf
a0e0: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66  ile).        CAf
a0f0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
a100: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69  LL;.    if (CAdi
a110: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20  r && !*CAdir).  
a120: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20        CAdir.    
a130: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a140: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
a150: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
a160: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
a170: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
a180: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
a190: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
a1a0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
a1b0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
a1c0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
a1d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
a1e0: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
a1f0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
a200: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
a210: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
a220: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
a230: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
a240: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
a250: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
a260: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
a270: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
a280: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
a290: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
a2a0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a2b0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
a2c0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a2d0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a2e0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
a2f0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
a300: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a310: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
a320: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a330: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
a340: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
a350: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
a360: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a370: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
a380: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a390: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a3a0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
a3b0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
a3c0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a3d0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a3e0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a3f0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
a400: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
a410: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
a420: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a430: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
a440: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
a450: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a460: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
a470: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a480: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a490: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
a4a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a4b0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
a4c0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
a4d0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
a4e0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
a4f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
a500: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
a510: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
a520: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a530: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a540: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a550: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a560: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a570: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
a580: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
a590: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
a5a0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
a5b0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
a5c0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
a5d0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
a5e0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
a5f0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
a600: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a620: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
a630: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
a640: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
a650: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
a660: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
a670: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a680: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a690: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a6a0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
a6b0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
a6c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
a6d0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a6e0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a6f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a700: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a710: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a720: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a730: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a740: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a750: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
a760: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
a770: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
a780: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
a790: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20  rt, key_len,..  
a7a0: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69    cert_len, CAdi
a7b0: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65  r, CAfile, ciphe
a7c0: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  rs, ciphersuites
a7d0: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d  , level, DHparam
a7e0: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  s)) == NULL) {..
a7f0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a800: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a810: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a820: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
a830: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a840: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20  ctx = ctx;..    
a850: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
a860: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
a870: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hat the channel 
a880: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20  works in binary 
a890: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20  (for the.     * 
a8a0: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74  encryption not t
a8b0: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29  o get goofed up)
a8c0: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79  ..     * We only
a8d0: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20   want to adjust 
a8e0: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e  the buffering in
a8f0: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73   pre-v2 channels
a900: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65  , where.     * e
a910: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74  ach channel in t
a920: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69  he stack maintai
a930: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66  ned its own buff
a940: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ers..     */.   
a950: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a960: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
a970: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
a980: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
a990: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
a9a0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
a9b0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
a9c0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
a9d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
a9e0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
a9f0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
aa00: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
aa10: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
aa20: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
aa30: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
aa40: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
aa50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
aa60: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
aa70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
aa80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
aa90: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
aaa0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
aab0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
aac0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
aad0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
aae0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
aaf0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ab00: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ab10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
ab20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ab30: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
ab40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ab50: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
ab60: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
ab70: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
ab80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ab90: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
aba0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
abb0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
abc0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
abd0: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
abe0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
abf0: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
ac00: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
ac10: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
ac20: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
ac30: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
ac40: 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43  a) statePtr, (TC
ac50: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c  L_READABLE | TCL
ac60: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e  _WRITABLE), chan
ac70: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
ac80: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20  Created channel 
ac90: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47  named %s", Tcl_G
aca0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
acb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
acc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
acd0: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
ace0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
acf0: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f  ./*.. * No use o
ad00: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79  f Tcl_Eventually
ad10: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20  Free because no 
ad20: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65  possible Tcl_Pre
ad30: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73  serve... */..Tls
ad40: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
ad50: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
ad60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ad70: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   }..    Tcl_SetC
ad80: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
ad90: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
ada0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  elf, "-translati
adb0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
adc0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
add0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
ade0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
adf0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ae00: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
ae10: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  f, "-encoding", 
ae20: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
ae30: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
ae40: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
ae50: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ae60: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
ae70: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66  Ptr->self, "-eof
ae80: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
ae90: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
aea0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
aeb0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
aec0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
aed0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
aee0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
aef0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
af00: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
af10: 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a  king));..    /*.
af20: 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69       * SSL Initi
af30: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a  alization.     *
af40: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
af50: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74  ssl = SSL_new(st
af60: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
af70: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d    if (!statePtr-
af80: 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20  >ssl) {../* SSL 
af90: 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f  library error */
afa0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
afb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
afc0: 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73  dn't construct s
afd0: 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52  sl session: ", R
afe0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
aff0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
b000: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b010: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b020: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20  MPORT", "INIT", 
b030: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b040: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
b050: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b060: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
b070: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b080: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
b090: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
b0a0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
b0b0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
b0c0: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
b0d0: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
b0e0: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
b0f0: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
b100: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
b110: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
b120: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
b130: 67 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  g. */..if (!SSL_
b140: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
b150: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
b160: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
b170: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
b180: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b190: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74  ult(interp, "set
b1a0: 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61  ting TLS host na
b1b0: 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  me extension fai
b1c0: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  led", (char *) N
b1d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b1e0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b1f0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b200: 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49  RT", "SNI", "FAI
b210: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b220: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
b230: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b240: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b250: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b260: 7d 0a 0a 09 2f 2a 20 43 6f 6e 66 69 67 75 72 65  }.../* Configure
b270: 20 73 65 72 76 65 72 20 68 6f 73 74 20 6e 61 6d   server host nam
b280: 65 20 63 68 65 63 6b 73 20 69 6e 20 74 68 65 20  e checks in the 
b290: 53 53 4c 20 63 6c 69 65 6e 74 2e 20 53 65 74 20  SSL client. Set 
b2a0: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 74 6f 0a  DNS hostname to.
b2b0: 09 20 20 20 6e 61 6d 65 20 66 6f 72 20 70 65 65  .   name for pee
b2c0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  r certificate ch
b2d0: 65 63 6b 73 2e 20 53 53 4c 5f 73 65 74 31 5f 68  ecks. SSL_set1_h
b2e0: 6f 73 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69  ost has limitati
b2f0: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
b300: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
b310: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
b320: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
b330: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b340: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
b350: 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66   DNS host name f
b360: 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ailed", (char *)
b370: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b380: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b390: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b3a0: 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45  PORT", "HOSTNAME
b3b0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b3c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b3d0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b3e0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b3f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b400: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b410: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65      /* Resume se
b420: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
b430: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26  if (session_id &
b440: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  & strlen(session
b450: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _id) <= SSL_MAX_
b460: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
b470: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
b480: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
b490: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
b4a0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
b4b0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
b4c0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73  tePtr->ssl), ses
b4d0: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
b4e0: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
b4f0: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
b500: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
b520: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20  sume session id 
b530: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22  ", session_id, "
b540: 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20   failed", (char 
b550: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b560: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b570: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b580: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b590: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b5a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
b5b0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
b5c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b5d0: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
b5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b5f0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
b600: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09     if (alpn) {..
b610: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c  /* Convert a TCL
b620: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f   list into a pro
b630: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69  tocol-list in wi
b640: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e  re-format */..un
b650: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
b660: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e  tos, *p;..unsign
b670: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65  ed int protos_le
b680: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c  n = 0;..int i, l
b690: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62  en, cnt;..Tcl_Ob
b6a0: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28  j **list;...if (
b6b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
b6c0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61  ements(interp, a
b6d0: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  lpn, &cnt, &list
b6e0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
b6f0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b700: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b710: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b720: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
b730: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
b740: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
b750: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
b760: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
b770: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
b780: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
b790: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
b7a0: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
b7b0: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
b7c0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
b7d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b7e0: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
b7f0: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63  me too long", (c
b800: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
b810: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b820: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b830: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
b840: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b850: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c  r *) NULL);...Tl
b860: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
b870: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
b880: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b890: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
b8a0: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e  s_len += 1 + len
b8b0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
b8c0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
b8d0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
b8e0: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
b8f0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
b900: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
b910: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
b920: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
b930: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
b940: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70  /..for (i = 0, p
b950: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63   = protos; i < c
b960: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
b970: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
b980: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
b990: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
b9a0: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e  ..    *p++ = len
b9b0: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
b9c0: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20   str, len);..   
b9d0: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
b9e0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
b9f0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
ba00: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
ba10: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
ba20: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
ba30: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68  ions reverses th
ba40: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
ba50: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
ba60: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
ba70: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
ba80: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
ba90: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
baa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
bab0: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65  t(interp, "faile
bac0: 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72  d to set ALPN pr
bad0: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20  otocols", (char 
bae0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
baf0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bb00: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bb10: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
bb20: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
bb30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
bb40: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
bb50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
bb60: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29    ckfree(protos)
bb70: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
bb80: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
bb90: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73   Store protocols
bba0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50   list */..stateP
bbb0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f  tr->protos = pro
bbc0: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tos;..statePtr->
bbd0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f  protos_len = pro
bbe0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
bbf0: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
bc00: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
bc10: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
bc20: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  s_len = 0;.    }
bc30: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
bc40: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
bc50: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65     */.    SSL_se
bc60: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65  t_app_data(state
bc70: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
bc80: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20  *)statePtr);./* 
bc90: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73  point back to us
bca0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
bcb0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
bcc0: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
bcd0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
bce0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
bcf0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
bd00: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
bd10: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
bd20: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
bd30: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
bd40: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
bd50: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
bd60: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
bd70: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
bd80: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
bd90: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
bda0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
bdb0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
bdc0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
bdd0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
bde0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
bdf0: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
be00: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
be10: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
be20: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
be30: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
be40: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
be50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
be60: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
be70: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
be80: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
be90: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
bea0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
beb0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
bec0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
bed0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
bee0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
bef0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
bf00: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
bf10: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
bf20: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
bf30: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
bf40: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
bf50: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
bf60: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
bf70: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
bf80: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
bf90: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
bfa0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
bfb0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
bfc0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
bfd0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
bfe0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
bff0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c000: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
c010: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c020: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c030: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
c040: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
c050: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
c060: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c070: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
c080: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
c090: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
c0a0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c0b0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
c0c0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
c0d0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
c0e0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
c0f0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c100: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
c110: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
c120: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
c130: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
c140: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
c150: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
c160: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
c170: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
c180: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
c190: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
c1a0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
c1b0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
c1c0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
c1d0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
c1e0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
c1f0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c200: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20  post_handshake) 
c210: 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66  {..    SSL_verif
c220: 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61  y_client_post_ha
c230: 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72  ndshake(statePtr
c240: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ->ssl);..}.../* 
c250: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20  Set server mode 
c260: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c  */..statePtr->fl
c270: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53  ags |= TLS_TCL_S
c280: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f  ERVER;..SSL_set_
c290: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61  accept_state(sta
c2a0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
c2b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c   } else {../* Cl
c2c0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a  ient callbacks *
c2d0: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
c2e0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
c2f0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26  protos != NULL &
c300: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26  & tls1_2 == 0 &&
c310: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
c320: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c330: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65  _next_proto_sele
c340: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
c350: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
c360: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c370: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  Ptr);..}.#endif.
c380: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63  ../* Session cac
c390: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  hing */..SSL_CTX
c3a0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _set_session_cac
c3b0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
c3c0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f  ->ctx, SSL_SESS_
c3d0: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53  CACHE_CLIENT | S
c3e0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f  SL_SESS_CACHE_NO
c3f0: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29  _INTERNAL_STORE)
c400: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f  ;..SSL_CTX_sess_
c410: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65  set_new_cb(state
c420: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f  Ptr->ctx, Sessio
c430: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a  nCallback);.../*
c440: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e   Enable post han
c450: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63  dshake Authentic
c460: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e  ation extension.
c470: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e   TLS 1.3 only, n
c480: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69  ot http/2. */..i
c490: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
c4a0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
c4b0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73  .    SSL_set_pos
c4c0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68  t_handshake_auth
c4d0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c4e0: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  1);..}.../* Set 
c4f0: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09  client mode */..
c500: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f  SSL_set_connect_
c510: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
c520: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
c530: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74  SSL_set_bio(stat
c540: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65  ePtr->ssl, state
c550: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74  Ptr->p_bio, stat
c560: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20  ePtr->p_bio);.  
c570: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74    BIO_set_ssl(st
c580: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61  atePtr->bio, sta
c590: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f  tePtr->ssl, BIO_
c5a0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f  NOCLOSE);..    /
c5b0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20  *.     * End of 
c5c0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f  SSL Init.     */
c5d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
c5e0: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c  turning %s", Tcl
c5f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
c600: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29  statePtr->self))
c610: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
c620: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
c630: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  r *) Tcl_GetChan
c640: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
c650: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c  ->self), TCL_VOL
c660: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74  ATILE);..    ret
c670: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
c680: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
c690: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72  --. *. * Unimpor
c6f0: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  tObjCmd --. *. *
c700: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
c710: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65  is invoked to re
c720: 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74  move the topmost
c730: 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e   channel filter.
c740: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
c750: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
c760: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
c770: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
c780: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
c790: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
c7a0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
c800: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  nt.UnimportObjCm
c810: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
c820: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
c830: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
c840: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
c850: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
c860: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
c870: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
c880: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
c890: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20  ode on. */..    
c8a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
c8b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
c8c0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
c8d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c8e0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
c8f0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
c900: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
c910: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
c920: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
c930: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
c940: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
c950: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
c960: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
c970: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
c980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c990: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
c9a0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
c9b0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
c9c0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
c9d0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
c9e0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
c9f0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
ca00: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
ca10: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
ca20: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
ca30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ca40: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
ca50: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
ca60: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
ca70: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
ca80: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
ca90: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
caa0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
cab0: 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20  S", "UNIMPORT", 
cac0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
cad0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
cae0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
caf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cb00: 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74      if (Tcl_Unst
cb10: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
cb20: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f  p, chan) == TCL_
cb30: 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e  ERROR) {..return
cb40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cb50: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  }..    return TC
cb60: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
cb70: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
cb80: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
cbd0: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63   * CTX_Init -- c
cbe0: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43  onstruct a SSL_C
cbf0: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20  TX instance. *. 
cc00: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
cc10: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e  valid SSL_CTX in
cc20: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a  stance or NULL..
cc30: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
cc40: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
cc50: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
cc60: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
ccb0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
ccc0: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65  *.CTX_Init(State
ccd0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
cce0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72  isServer, int pr
ccf0: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69  oto, char *keyfi
cd00: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69  le, char *certfi
cd10: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  le,.    unsigned
cd20: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69   char *key, unsi
cd30: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c  gned char *cert,
cd40: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e   int key_len, in
cd50: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72  t cert_len, char
cd60: 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61   *CAdir,.    cha
cd70: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
cd80: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
cd90: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
cda0: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
cdb0: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54  Hparams) {.    T
cdc0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cdd0: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
cde0: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
cdf0: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
ce00: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
ce10: 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  s;.    Tcl_DStri
ce20: 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20  ng ds1;.    int 
ce30: 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  off = 0;.    int
ce40: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65   load_private_ke
ce50: 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  y;.    const SSL
ce60: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b  _METHOD *method;
ce70: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
ce80: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
ce90: 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c   (!proto) {..Tcl
cea0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ceb0: 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20  terp, "no valid 
cec0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
ced0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
cee0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
cef0: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53      /* create SS
cf00: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66  L context */.#if
cf10: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
cf20: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
cf30: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
cf40: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
cf50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
cf60: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45  _SSL2).    if (E
cf70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
cf80: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
cf90: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
cfa0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32  lt(interp, "SSL2
cfb0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
cfc0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
cfd0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
cfe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
cff0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d000: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d010: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
d020: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d030: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
d040: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
d050: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d060: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
d070: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d080: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d090: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d0a0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d0b0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
d0c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d0d0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
d0e0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d0f0: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63  OTO_TLS1)) {..Tc
d100: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d110: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20  nterp, "TLS 1.0 
d120: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d130: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
d140: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d150: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d160: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
d170: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d180: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
d190: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d1a0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d1b0: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
d1c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d1d0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70  terp, "TLS 1.1 p
d1e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d1f0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
d200: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d210: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d220: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
d230: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d240: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
d250: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d260: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d270: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_2)) {..Tcl_
d280: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d290: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72  erp, "TLS 1.2 pr
d2a0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d2b0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
d2c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d2d0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
d2e0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
d2f0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d300: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
d310: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d320: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
d330: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_3)) {..Tcl_A
d340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d350: 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f  rp, "TLS 1.3 pro
d360: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d370: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
d380: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d390: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69  .#endif..    swi
d3a0: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69  tch (proto) {.#i
d3b0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
d3c0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
d3d0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
d3e0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
d3f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d400: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
d410: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
d420: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d430: 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72  rver ? SSLv2_ser
d440: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
d450: 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv2_client_meth
d460: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d470: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d480: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
d490: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d4a0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
d4b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d4c0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
d4d0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
d4e0: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  SL3:..method = i
d4f0: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f  sServer ? SSLv3_
d500: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d510: 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d  : SSLv3_client_m
d520: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d530: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d540: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
d550: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d560: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  L_NO_TLS1) && !d
d570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d580: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20  O_TLS1_METHOD). 
d590: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d5a0: 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20  O_TLS1:..method 
d5b0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
d5c0: 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v1_server_method
d5d0: 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e  () : TLSv1_clien
d5e0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
d5f0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
d600: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
d610: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
d620: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
d630: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d640: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
d650: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
d660: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d670: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  1:..method = isS
d680: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f  erver ? TLSv1_1_
d690: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d6a0: 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74  : TLSv1_1_client
d6b0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d6c0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
d6d0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
d6e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d6f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
d700: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d710: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
d720: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
d730: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
d740: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d750: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73  rver ? TLSv1_2_s
d760: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d770: 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f   TLSv1_2_client_
d780: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d790: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
d7a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
d7b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d7c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
d7d0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d7e0: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55  TO_TLS1_3:../* U
d7f0: 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d  se the generic m
d800: 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72  ethod and constr
d810: 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72  aint range after
d820: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61   context is crea
d830: 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d  ted */..method =
d840: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f   isServer ? TLS_
d850: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d860: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74  : TLS_client_met
d870: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
d880: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
d890: 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65  t:../* Negotiate
d8a0: 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62   highest availab
d8b0: 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69  le SSL/TLS versi
d8c0: 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  on */..method = 
d8d0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
d8e0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d8f0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
d900: 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  od();.#if OPENSS
d910: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
d920: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
d930: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
d940: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
d950: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
d960: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
d970: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d980: 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a  TO_SSL2)   ? 0 :
d990: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32   SSL_OP_NO_SSLv2
d9a0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
d9b0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
d9c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d9d0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66  SSL_NO_SSL3)..of
d9e0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
d9f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
da00: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  SL3)   ? 0 : SSL
da10: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23  _OP_NO_SSLv3);.#
da20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
da30: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
da40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
da50: 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d  NO_TLS1)..off |=
da60: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
da70: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
da80: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
da90: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69  NO_TLSv1);.#endi
daa0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
dab0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
dac0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dad0: 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d  _TLS1_1)..off |=
dae0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
daf0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
db00: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  1) ? 0 : SSL_OP_
db10: 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e  NO_TLSv1_1);.#en
db20: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
db30: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
db40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
db50: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20  NO_TLS1_2)..off 
db60: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
db70: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
db80: 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_2) ? 0 : SSL_O
db90: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23  P_NO_TLSv1_2);.#
dba0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
dbb0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
dbc0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dbd0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66  L_NO_TLS1_3)..of
dbe0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
dbf0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
dc00: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_3) ? 0 : SSL
dc10: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b  _OP_NO_TLSv1_3);
dc20: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a  .#endif..break;.
dc30: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
dc40: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
dc50: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
dc60: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
dc70: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72    if (!ctx) {..r
dc80: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20  eturn(NULL);.   
dc90: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65   }..    if (gete
dca0: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45  nv(SSLKEYLOGFILE
dcb0: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  )) {..SSL_CTX_se
dcc0: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63  t_keylog_callbac
dcd0: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c  k(ctx, KeyLogCal
dce0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23  lback);.    }..#
dcf0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dd00: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
dd10: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
dd20: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72  S1_3).    if (pr
dd30: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f  oto == TLS_PROTO
dd40: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f  _TLS1_3) {..SSL_
dd50: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
dd60: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
dd70: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
dd80: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
dd90: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
dda0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
ddb0: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ON);.    }.#endi
ddc0: 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20  f..    /* Force 
ddd0: 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e  cipher selection
dde0: 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72   order by server
ddf0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53   */.    if (!isS
de00: 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54  erver) {..SSL_CT
de10: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
de20: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52  x, SSL_OP_CIPHER
de30: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e  _SERVER_PREFEREN
de40: 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CE);.    }..    
de50: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
de60: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a  data(ctx, (void*
de70: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d  )interp);./* rem
de80: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
de90: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
dea0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
deb0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
dec0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
ded0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
dee0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
def0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
df00: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20  f);../* disable 
df10: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
df20: 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  s */.#if OPENSSL
df30: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
df40: 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20  < 0x10101000L.  
df50: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f    SSL_CTX_set_mo
df60: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45  de(ctx, SSL_MODE
df70: 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a  _AUTO_RETRY);./*
df80: 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64   handle new hand
df90: 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72  shakes in backgr
dfa0: 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61  ound. On by defa
dfb0: 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ult in OpenSSL 1
dfc0: 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  .1.1. */.#endif.
dfd0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
dfe0: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
dff0: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20  ctx, 128);..    
e000: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69  /* Set user defi
e010: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70  ned ciphers, cip
e020: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20  her suites, and 
e030: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
e040: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  /.    if ((ciphe
e050: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  rs != NULL) && !
e060: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
e070: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70  er_list(ctx, cip
e080: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  hers)) {..Tcl_Ap
e090: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e0a0: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20  p, "Set ciphers 
e0b0: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
e0c0: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
e0d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
e0e0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e0f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e100: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
e110: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
e120: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e130: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
e140: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
e150: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
e160: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e170: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
e180: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
e190: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
e1a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
e1b0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e1c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e1d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
e1e0: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
e1f0: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c  */.    if (level
e200: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c   > -1 && level <
e210: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65   6) {../* SSL_se
e220: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
e230: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
e240: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
e250: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20  ctx, level);.   
e260: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73   }..    /* set s
e270: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
e280: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e290: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e2a0: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
e2b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
e2c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
e2d0: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65  lt_passwd_cb_use
e2e0: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  rdata(ctx, (void
e2f0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20   *)statePtr);.. 
e300: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66     /* read a Dif
e310: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61  fie-Hellman para
e320: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20  meters file, or 
e330: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  use the built-in
e340: 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f   one */.#ifdef O
e350: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20  PENSSL_NO_DH.   
e360: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d   if (DHparams !=
e370: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
e380: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e390: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72  p, "DH parameter
e3a0: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61   support not ava
e3b0: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a  ilable", (char *
e3c0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
e3d0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
e3e0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e3f0: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48  .#else.    {..DH
e400: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72  * dh;..if (DHpar
e410: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
e420: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20      BIO *bio;.. 
e430: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
e440: 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69  it(&ds);..    bi
e450: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65  o = BIO_new_file
e460: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26  (F2N(DHparams, &
e470: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20  ds), "r");..    
e480: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63  if (!bio) {...Tc
e490: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e4a0: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  s);...Tcl_Append
e4b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e4c0: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44  Could not find D
e4d0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  H parameters fil
e4e0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
e4f0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
e500: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
e510: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a  n NULL;..    }..
e520: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65  .    dh = PEM_re
e530: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28  ad_bio_DHparams(
e540: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  bio, NULL, NULL,
e550: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f   NULL);..    BIO
e560: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20  _free(bio);..   
e570: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
e580: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28  (&ds);..    if (
e590: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  !dh) {...Tcl_App
e5a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e5b0: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "Could not rea
e5c0: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  d DH parameters 
e5d0: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61  from file", (cha
e5e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
e5f0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e600: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
e610: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b  .    }..} else {
e620: 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64  ..    dh = get_d
e630: 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53  hParams();..}..S
e640: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64  SL_CTX_set_tmp_d
e650: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f  h(ctx, dh);..DH_
e660: 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a  free(dh);.    }.
e670: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73  #endif..    /* s
e680: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61  et our certifica
e690: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70  te */.    load_p
e6a0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a  rivate_key = 0;.
e6b0: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
e6c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61   != NULL) {..loa
e6d0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
e6e0: 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  1;...Tcl_DString
e6f0: 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20  Init(&ds);...if 
e700: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
e710: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
e720: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c  x, F2N(certfile,
e730: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
e740: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
e750: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e760: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
e770: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e780: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
e790: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
e7a0: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
e7b0: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09  tfile, ": ",....
e7c0: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
e7d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e7e0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
e7f0: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
e800: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20  rn NULL;..}.    
e810: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
e820: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
e830: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
e840: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
e850: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
e860: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65  SN1(ctx, cert_le
e870: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
e880: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e890: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
e8a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e8b0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
e8c0: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
e8d0: 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20  cate: ",....    
e8e0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
e8f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
e900: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e910: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
e920: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
e930: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d  se {..certfile =
e940: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74   (char*)X509_get
e950: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69  _default_cert_fi
e960: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  le();...if (SSL_
e970: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
e980: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
e990: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  rtfile, SSL_FILE
e9a0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
e9b0: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
e9c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
e9d0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
e9e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e9f0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
ea00: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63  default certific
ea10: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
ea20: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20  file, ": ",.... 
ea30: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
ea40: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ea50: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
ea60: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
ea70: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09  n NULL;.#endif..
ea80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ea90: 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20  set our private 
eaa0: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c  key */.    if (l
eab0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29  oad_private_key)
eac0: 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20   {..if (keyfile 
ead0: 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d  == NULL && key =
eae0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b  = NULL) {..    k
eaf0: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
eb00: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66  e;..}...if (keyf
eb10: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
eb20: 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70      /* get the p
eb30: 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63  rivate key assoc
eb40: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
eb50: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
eb60: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
eb70: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79  == NULL) {...key
eb80: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
eb90: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
eba0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
ebb0: 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74  ivateKey_file(ct
ebc0: 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20  x, F2N(keyfile, 
ebd0: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59  &ds), SSL_FILETY
ebe0: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
ebf0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
ec00: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
ec10: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
ec20: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
ec30: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
ec40: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
ec50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
ec60: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
ec70: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
ec80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
ec90: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
eca0: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b  ic key file ", k
ecb0: 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09  eyfile, " ",....
ecc0: 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28           REASON(
ecd0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
ece0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
ecf0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
ed00: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
ed10: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
ed20: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73  ee(&ds);...} els
ed30: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
ed40: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
ed50: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
ed60: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
ed70: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
ed80: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20  ,key_len) <= 0) 
ed90: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
eda0: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
edb0: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
edc0: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
edd0: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
ede0: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
edf0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
ee00: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
ee10: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
ee20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ee30: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
ee40: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41  blic key: ", REA
ee50: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
ee60: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
ee70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
ee80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
ee90: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20  }..}../* Now we 
eea0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
eeb0: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
eec0: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09  en set against..
eed0: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65   * the SSL conte
eee0: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  xt */..if (!SSL_
eef0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74  CTX_check_privat
ef00: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20  e_key(ctx)) {.. 
ef10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ef20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69  ult(interp, "pri
ef30: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
ef40: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
ef50: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
ef60: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
ef70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
ef80: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
ef90: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
efa0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a   NULL;..}.    }.
efb0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69  .    /* Set veri
efc0: 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a  fication CAs */.
efd0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
efe0: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63  nit(&ds);.    Tc
eff0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
f000: 73 31 29 3b 0a 20 20 20 20 69 66 20 28 21 53 53  s1);.    if (!SS
f010: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
f020: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c  y_locations(ctx,
f030: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73   F2N(CAfile, &ds
f040: 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64  ), F2N(CAdir, &d
f050: 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54  s1)) ||..!SSL_CT
f060: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65  X_set_default_ve
f070: 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29  rify_paths(ctx))
f080: 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53   {.#if 0..Tcl_DS
f090: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f0a0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
f0b0: 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27  (&ds1);../* Don'
f0c0: 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65  t currently care
f0d0: 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a   if this fails *
f0e0: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
f0f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
f100: 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20   default verify 
f110: 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e  paths: ", REASON
f120: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f130: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
f140: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
f150: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  NULL;.#endif.   
f160: 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73   }..    /* https
f170: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  ://sourceforge.n
f180: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37  et/p/tls/bugs/57
f190: 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a  / */.    /* XXX:
f1a0: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
f1b0: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
f1c0: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
f1d0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
f1e0: 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
f1f0: 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20  lesystem */.    
f200: 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55  if (CAfile != NU
f210: 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28  LL) {..STACK_OF(
f220: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
f230: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
f240: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
f250: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
f260: 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65  );..if (certName
f270: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
f280: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c    SSL_CTX_set_cl
f290: 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78  ient_CA_list(ctx
f2a0: 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d  , certNames);..}
f2b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
f2c0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f2d0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
f2e0: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20  gFree(&ds1);.   
f2f0: 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c   return ctx;.}..
f300: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
f310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
f350: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20  StatusObjCmd -- 
f360: 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61  return certifica
f370: 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64  te for connected
f380: 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73   peer.. *. * Res
f390: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
f3a0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
f3b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
f3c0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
f3d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
f3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f410: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
f420: 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d   int.StatusObjCm
f430: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
f440: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
f450: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
f460: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
f470: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
f480: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
f490: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70  Ptr;.    X509 *p
f4a0: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  eer;.    Tcl_Obj
f4b0: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63   *objPtr;.    Tc
f4c0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
f4d0: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65      char *channe
f4e0: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b  lName, *ciphers;
f4f0: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20  .    int mode;. 
f500: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
f510: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20  d char *proto;. 
f520: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
f530: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64  len;.    int nid
f540: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
f550: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73  Called");..    s
f560: 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09  witch (objc) {..
f570: 63 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61  case 2:..    cha
f580: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  nnelName = Tcl_G
f590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f5a0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a  objv[1], NULL);.
f5b0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61  .    break;...ca
f5c0: 73 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21  se 3:..    if (!
f5d0: 73 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53  strcmp (Tcl_GetS
f5e0: 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c  tring (objv[1]),
f5f0: 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09   "-local")) {...
f600: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63  channelName = Tc
f610: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f620: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c  bj(objv[2], NULL
f630: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
f640: 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20   }..    /* else 
f650: 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e  fall-through ...
f660: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
f670: 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f  __GNUC__)..    _
f680: 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61  _attribute__((fa
f690: 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e  llthrough));.#en
f6a0: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  dif..default:.. 
f6b0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f6c0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
f6d0: 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63  bjv, "?-local? c
f6e0: 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72  hannel");..    r
f6f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f700: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
f710: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
f720: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65  l(interp, channe
f730: 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20  lName, &mode);. 
f740: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
f750: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
f760: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
f770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f780: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f790: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
f7a0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
f7b0: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
f7c0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
f7d0: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
f7e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
f7f0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
f800: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
f810: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
f820: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
f830: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
f840: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
f850: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
f860: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
f870: 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  , NULL);..Tcl_Se
f880: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
f890: 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
f8a0: 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  S", "CHANNEL", "
f8b0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
f8c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
f8d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f8e0: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
f8f0: 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
f900: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
f910: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
f920: 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66     /* Get certif
f930: 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f  icate for peer o
f940: 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66  r self */.    if
f950: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
f960: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
f970: 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
f980: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
f990: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
f9a0: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
f9b0: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
f9c0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
f9d0: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09     if (peer) {..
f9e0: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77  objPtr = Tls_New
f9f0: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20  X509Obj(interp, 
fa00: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63  peer);..if (objc
fa10: 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72   == 2) { X509_fr
fa20: 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20  ee(peer); }.    
fa30: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72  } else {..objPtr
fa40: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
fa50: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
fa60: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 63  }..    /* Peer c
fa70: 65 72 74 20 63 68 61 69 6e 20 28 63 6c 69 65 6e  ert chain (clien
fa80: 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 20 20 53  t only) */.    S
fa90: 54 41 43 4b 5f 4f 46 28 58 35 30 39 29 2a 20 73  TACK_OF(X509)* s
faa0: 73 6c 5f 63 65 72 74 73 20 3d 20 53 53 4c 5f 67  sl_certs = SSL_g
fab0: 65 74 5f 70 65 65 72 5f 63 65 72 74 5f 63 68 61  et_peer_cert_cha
fac0: 69 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  in(statePtr->ssl
fad0: 29 3b 0a 20 20 20 20 69 66 20 28 21 70 65 65 72  );.    if (!peer
fae0: 20 26 26 20 28 73 73 6c 5f 63 65 72 74 73 20 3d   && (ssl_certs =
faf0: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 6b 5f 58 35 30  = NULL || sk_X50
fb00: 39 5f 6e 75 6d 28 73 73 6c 5f 63 65 72 74 73 29  9_num(ssl_certs)
fb10: 20 3d 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f 53   == 0)) {..Tcl_S
fb20: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
fb30: 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54  rp, "TLS", "STAT
fb40: 55 53 22 2c 20 22 43 45 52 54 49 46 49 43 41 54  US", "CERTIFICAT
fb50: 45 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  E", (char *) NUL
fb60: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
fb70: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
fb80: 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 66    /* Peer name f
fb90: 72 6f 6d 20 63 65 72 74 20 2a 2f 0a 20 20 20 20  rom cert */.    
fba0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fbb0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
fbc0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
fbd0: 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 6e  StringObj("peern
fbe0: 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ame", -1));.    
fbf0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fc00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
fc10: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
fc20: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
fc30: 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
fc40: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29  ePtr->ssl), -1))
fc50: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
fc60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fc70: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fc80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
fc90: 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a  ("sbits", -1));.
fca0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
fcb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fcc0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
fcd0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67  _NewIntObj(SSL_g
fce0: 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73  et_cipher_bits(s
fcf0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55  tatePtr->ssl, NU
fd00: 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 68  LL)));..    ciph
fd10: 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c  ers = (char*)SSL
fd20: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
fd30: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
fd40: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20  if ((ciphers != 
fd50: 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63 6d 70  NULL) && (strcmp
fd60: 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45  (ciphers, "(NONE
fd70: 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 63  )") != 0)) {..Tc
fd80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fd90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
fda0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
fdb0: 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22  ringObj("cipher"
fdc0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
fdd0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fde0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fdf0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fe00: 62 6a 28 63 69 70 68 65 72 73 2c 20 2d 31 29 29  bj(ciphers, -1))
fe10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fe20: 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20  Verify the X509 
fe30: 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73  certificate pres
fe40: 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65  ented by the pee
fe50: 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  r */.    Tcl_Lis
fe60: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fe70: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
fe80: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fe90: 62 6a 28 22 76 65 72 69 66 79 52 65 73 75 6c 74  bj("verifyResult
fea0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
feb0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fec0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
fed0: 6a 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74  jPtr,..Tcl_NewSt
fee0: 72 69 6e 67 4f 62 6a 28 58 35 30 39 5f 76 65 72  ringObj(X509_ver
fef0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
ff00: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
ff10: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
ff20: 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
ff30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
ff40: 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 54 63  y mode */.    Tc
ff50: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ff60: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
ff70: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ff80: 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 4d  ringObj("verifyM
ff90: 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ode", -1));.    
ffa0: 2f 2a 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76  /* SSL_CTX_get_v
ffb0: 65 72 69 66 79 5f 6d 6f 64 65 28 63 74 78 29 20  erify_mode(ctx) 
ffc0: 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53  */.    mode = SS
ffd0: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64  L_get_verify_mod
ffe0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
fff0: 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26  ;.    if (mode &
10000 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  & SSL_VERIFY_NON
10010 45 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  E) {..Tcl_ListOb
10020 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
10030 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
10040 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10050 22 6e 6f 6e 65 22 2c 20 2d 31 29 29 3b 0a 20 20  "none", -1));.  
10060 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
10070 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20  Obj *listObjPtr 
10080 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
10090 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  (0, NULL);..if (
100a0 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
100b0 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20  FY_PEER) {..    
100c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
100d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
100e0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
100f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
10100 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  eer", -1));..}..
10110 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10120 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
10130 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09  O_PEER_CERT) {..
10140 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10150 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10160 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10170 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10180 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65  j("fail if no pe
10190 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a  er cert", -1));.
101a0 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
101b0 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
101c0 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54  T_ONCE) {..    T
101d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
101e0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
101f0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
10200 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c  NewStringObj("cl
10210 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29  ient once", -1))
10220 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
10230 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  & SSL_VERIFY_POS
10240 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09  T_HANDSHAKE) {..
10250 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10260 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10270 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10280 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10290 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  j("post handshak
102a0 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63  e", -1));..}..Tc
102b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
102c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
102d0 62 6a 50 74 72 2c 20 6c 69 73 74 4f 62 6a 50 74  bjPtr, listObjPt
102e0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
102f0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65  * Verify mode de
10300 70 74 68 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  pth */.    Tcl_L
10310 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10320 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10330 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10340 67 4f 62 6a 28 22 76 65 72 69 66 79 44 65 70 74  gObj("verifyDept
10350 68 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 2f 2a  h", -1));.    /*
10360 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 76 65 72   SSL_CTX_get_ver
10370 69 66 79 5f 64 65 70 74 68 28 63 74 78 29 20 2a  ify_depth(ctx) *
10380 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
10390 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
103a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
103b0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c  cl_NewIntObj(SSL
103c0 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74  _get_verify_dept
103d0 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  h(statePtr->ssl)
103e0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f  ));..    /* Repo
103f0 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
10400 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
10410 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f  sult of the nego
10420 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53  tiation */.    S
10430 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  SL_get0_alpn_sel
10440 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e  ected(statePtr->
10450 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ssl, &proto, &le
10460 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  n);.    Tcl_List
10470 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10480 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10490 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
104a0 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
104b0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
104c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
104d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
104e0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
104f0 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e  har *)proto, (in
10500 74 29 20 6c 65 6e 29 29 3b 0a 20 20 20 20 54 63  t) len));.    Tc
10510 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10520 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10530 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10540 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f  ringObj("protoco
10550 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  l", -1));.    Tc
10560 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10570 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10580 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10590 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
105a0 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72  version(statePtr
105b0 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20  ->ssl), -1));.. 
105c0 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
105d0 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
105e0 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
105f0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10600 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10610 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
10620 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10630 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67  signatureHashAlg
10640 6f 72 69 74 68 6d 22 2c 20 2d 31 29 29 3b 0a 20  orithm", -1));. 
10650 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
10660 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   ? SSL_get_peer_
10670 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
10680 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10690 64 29 20 3a 20 53 53 4c 5f 67 65 74 5f 73 69 67  d) : SSL_get_sig
106a0 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65  nature_nid(state
106b0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29  Ptr->ssl, &nid))
106c0 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
106d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
106e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
106f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42  _NewStringObj(OB
10700 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
10710 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
10720 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
10730 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
10740 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
10750 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
10760 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20   -1));.    }.   
10770 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10780 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10790 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
107a0 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 69 67 6e  wStringObj("sign
107b0 61 74 75 72 65 54 79 70 65 22 2c 20 2d 31 29 29  atureType", -1))
107c0 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ;.    if (objc =
107d0 3d 20 32 20 3f 20 53 53 4c 5f 67 65 74 5f 70 65  = 2 ? SSL_get_pe
107e0 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
107f0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
10800 73 73 6c 2c 20 26 6e 69 64 29 20 3a 20 53 53 4c  ssl, &nid) : SSL
10810 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74  _get_signature_t
10820 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ype_nid(statePtr
10830 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 29 20 7b 0a  ->ssl, &nid)) {.
10840 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10850 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10860 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10870 77 53 74 72 69 6e 67 4f 62 6a 28 4f 42 4a 5f 6e  wStringObj(OBJ_n
10880 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 29  id2ln(nid), -1))
10890 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
108a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
108b0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
108c0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
108d0 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31  StringObj("", -1
108e0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ));.    }..    T
108f0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10900 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
10910 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10920 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
10930 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
10940 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
10950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
10990 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
109a0 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
109b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  connection info 
109c0 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a  from OpenSSL.. *
109d0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
109e0 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63  A list of connec
109f0 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a  tion info.  *. *
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
10a50 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  int ConnectionIn
10a60 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  foObjCmd(ClientD
10a70 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
10a80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10a90 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
10aa0 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
10ab0 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
10ac0 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
10ad0 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
10ae0 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
10af0 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
10b00 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
10b10 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
10b20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
10b30 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20  l_Obj *objPtr;. 
10b40 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73     const SSL *ss
10b50 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  l;.    const SSL
10b60 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
10b70 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53  .    const SSL_S
10b80 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b  ESSION *session;
10b90 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
10ba0 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b  ned char *proto;
10bb0 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 3b 0a  .    long mode;.
10bc0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
10bd0 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
10be0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10bf0 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
10c00 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  l");..return(TCL
10c10 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
10c20 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10c30 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
10c40 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
10c50 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
10c60 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  NULL), NULL);.  
10c70 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
10c80 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
10c90 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ) {..return(TCL_
10ca0 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
10cb0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
10cc0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
10cd0 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
10ce0 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
10cf0 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
10d00 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
10d10 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
10d20 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
10d30 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
10d40 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
10d50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
10d60 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
10d70 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
10d80 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
10d90 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
10da0 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
10db0 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
10dc0 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43  nterp, "TLS", "C
10dd0 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41  ONNECTION", "CHA
10de0 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
10df0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
10e00 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
10e10 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
10e20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65   objPtr = Tcl_Ne
10e30 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
10e40 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  );..    /* Conne
10e50 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ction info */.  
10e60 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
10e70 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
10e80 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
10e90 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20  (chan);.    ssl 
10ea0 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b  = statePtr->ssl;
10eb0 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
10ec0 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e  NULL) {../* conn
10ed0 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a  ection state */.
10ee0 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
10ef0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10f00 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
10f10 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 74  wStringObj("stat
10f20 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  e", -1));..Tcl_L
10f30 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10f40 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
10f50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10f60 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73  gObj(SSL_state_s
10f70 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c  tring_long(ssl),
10f80 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20   -1));.../* Get 
10f90 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65  SNI requested se
10fa0 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 54 63  rver name */..Tc
10fb0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10fc0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
10fd0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10fe0 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 65 72 6e  ringObj("servern
10ff0 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ame", -1));..Tcl
11000 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11010 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
11020 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11030 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 73  ingObj(SSL_get_s
11040 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54  ervername(ssl, T
11050 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
11060 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29 3b  ost_name), -1));
11070 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63  .../* Get protoc
11080 6f 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  ol */..Tcl_ListO
11090 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
110a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
110b0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
110c0 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29  ("protocol", -1)
110d0 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
110e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
110f0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11100 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
11110 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73  L_get_version(ss
11120 6c 29 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a 20 52  l), -1));.../* R
11130 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c  enegotiation all
11140 6f 77 65 64 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  owed */..Tcl_Lis
11150 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11160 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11170 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11180 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69 6f  bj("renegotiatio
11190 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n", -1));..Tcl_L
111a0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
111b0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
111c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
111d0 67 4f 62 6a 28 0a 09 20 20 20 20 53 53 4c 5f 67  gObj(..    SSL_g
111e0 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f  et_secure_renego
111f0 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28  tiation_support(
11200 73 73 6c 29 20 3f 20 22 73 75 70 70 6f 72 74 65  ssl) ? "supporte
11210 64 22 20 3a 20 22 6e 6f 74 20 73 75 70 70 6f 72  d" : "not suppor
11220 74 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 09 2f 2a  ted", -1));.../*
11230 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65   Get security le
11240 76 65 6c 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74  vel */..Tcl_List
11250 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11260 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11270 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11280 6a 28 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c  j("securitylevel
11290 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
112a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
112b0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
112c0 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
112d0 28 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74  (SSL_get_securit
112e0 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 29 3b 0a  y_level(ssl)));.
112f0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66  ../* Session inf
11300 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  o */..Tcl_ListOb
11310 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11320 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
11330 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11340 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
11350 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
11360 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11370 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11380 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
11390 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f  Obj(SSL_session_
113a0 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a  reused(ssl)));..
113b0 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e  ./* Is server in
113c0 66 6f 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  fo */..Tcl_ListO
113d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
113e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
113f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11400 28 22 69 73 5f 73 65 72 76 65 72 22 2c 20 2d 31  ("is_server", -1
11410 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
11420 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11430 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11440 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
11450 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73  SSL_is_server(ss
11460 6c 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  l)));.    }..   
11470 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20   /* Cipher info 
11480 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20  */.    cipher = 
11490 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
114a0 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20  cipher(ssl);.   
114b0 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e   if (cipher != N
114c0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
114d0 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a  [BUFSIZ] = {0};.
114e0 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62  .int bits, alg_b
114f0 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  its;...Tcl_ListO
11500 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11510 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11520 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11530 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b  ("cipher", -1));
11540 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11550 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11560 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11570 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
11580 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
11590 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09  cipher), -1));..
115a0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
115b0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
115c0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
115d0 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64  StringObj("stand
115e0 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b  ard_name", -1));
115f0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
11600 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11610 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
11620 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
11630 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f  CIPHER_standard_
11640 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31  name(cipher), -1
11650 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c  ));...bits = SSL
11660 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73  _CIPHER_get_bits
11670 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69  (cipher, &alg_bi
11680 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ts);..Tcl_ListOb
11690 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
116a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
116b0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
116c0 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54  "bits", -1));..T
116d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
116e0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
116f0 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  objPtr, Tcl_NewI
11700 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09 54  ntObj(bits));..T
11710 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11720 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11730 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
11740 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65 74  tringObj("secret
11750 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54  _bits", -1));..T
11760 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11770 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11780 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  objPtr, Tcl_NewI
11790 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29  ntObj(alg_bits))
117a0 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69  ;../* alg_bits i
117b0 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63  s actual key sec
117c0 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65  ret bits. If use
117d0 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74   bits and secret
117e0 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74   (algorithm) bit
117f0 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68  s differ,..   th
11800 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69  e rest of the bi
11810 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e  ts are fixed, i.
11820 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65  e. for limited e
11830 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62  xport ciphers (b
11840 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63  its < 56) */..Tc
11850 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11860 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
11870 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
11880 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72  ringObj("min_ver
11890 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63  sion", -1));..Tc
118a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
118b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
118c0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
118d0 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48  ringObj(SSL_CIPH
118e0 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
118f0 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09  ipher), -1));...
11900 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73  /* Get OpenSSL-s
11910 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20  pecific ID, not 
11920 49 41 4e 41 20 49 44 20 2a 2f 0a 09 54 63 6c 5f  IANA ID */..Tcl_
11930 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11940 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
11950 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11960 6e 67 4f 62 6a 28 22 69 64 22 2c 20 2d 31 29 29  ngObj("id", -1))
11970 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
11980 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11990 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
119a0 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 20  NewIntObj((int) 
119b0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69  SSL_CIPHER_get_i
119c0 64 28 63 69 70 68 65 72 29 29 29 3b 0a 0a 09 69  d(cipher)));...i
119d0 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
119e0 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72  scription(cipher
119f0 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
11a00 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f)) != NULL) {..
11a10 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
11a20 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11a30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11a40 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64  _NewStringObj("d
11a50 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29  escription", -1)
11a60 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
11a70 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11a80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11a90 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11aa0 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a  j(buf, -1));..}.
11ab0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
11ac0 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
11ad0 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
11ae0 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
11af0 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
11b00 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
11b10 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11b20 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
11b30 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
11b40 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
11b50 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11b60 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 09  r *session_id;..
11b70 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f  char buffer[SSL_
11b80 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
11b90 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70  ENGTH];.../* Rep
11ba0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
11bb0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
11bc0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50  esult of the ALP
11bd0 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
11be0 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
11bf0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
11c00 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f  (session, &proto
11c10 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c  , &len2);..Tcl_L
11c20 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11c30 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
11c40 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11c50 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29  gObj("alpn", -1)
11c60 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11c70 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11c80 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11c90 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
11ca0 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e  har *)proto, (in
11cb0 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09 2f 2a 20  t) len2));.../* 
11cc0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
11cd0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
11ce0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
11cf0 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
11d00 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
11d10 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
11d20 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
11d30 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
11d40 75 6c 65 6e 29 3b 0a 09 54 63 6c 5f 4c 69 73 74  ulen);..Tcl_List
11d50 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11d60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11d70 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11d80 6a 28 22 6e 70 6e 22 2c 20 2d 31 29 29 3b 0a 09  j("npn", -1));..
11d90 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11da0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11db0 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
11dc0 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20  StringObj((char 
11dd0 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75  *)proto, (int) u
11de0 6c 65 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  len));.#endif...
11df0 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73  /* Resumable ses
11e00 73 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73  sion */..Tcl_Lis
11e10 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11e20 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11e30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11e40 62 6a 28 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  bj("resumable", 
11e50 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
11e60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11e70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11e80 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53  Tcl_NewIntObj(SS
11e90 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73  L_SESSION_is_res
11ea0 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29  umable(session))
11eb0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
11ec0 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f  start time (seco
11ed0 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29  nds since epoch)
11ee0 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
11ef0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11f00 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
11f10 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11f20 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 2d 31 29  start_time", -1)
11f30 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
11f40 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11f50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
11f60 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f  _NewLongObj(SSL_
11f70 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
11f80 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 09 2f  (session)));.../
11f90 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  * Timeout value 
11fa0 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69  - SSL_CTX_get_ti
11fb0 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64  meout (in second
11fc0 73 29 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f  s) */..Tcl_ListO
11fd0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
11fe0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11ff0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12000 28 22 74 69 6d 65 6f 75 74 22 2c 20 2d 31 29 29  ("timeout", -1))
12010 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
12020 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12040 4e 65 77 4c 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53  NewLongObj(SSL_S
12050 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f  ESSION_get_timeo
12060 75 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  ut(session)));..
12070 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
12080 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74  et lifetime hint
12090 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f   (in seconds) */
120a0 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
120b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
120c0 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
120d0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 66  ewStringObj("lif
120e0 65 74 69 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54  etime", -1));..T
120f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12100 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12110 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 4c  objPtr, Tcl_NewL
12120 6f 6e 67 4f 62 6a 28 53 53 4c 5f 53 45 53 53 49  ongObj(SSL_SESSI
12130 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
12140 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
12150 69 6f 6e 29 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  ion)));.../* Ses
12160 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 73 65 73 73  sion id */..sess
12170 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
12180 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
12190 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 54 63  ion, &ulen);..Tc
121a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
121b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
121c0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
121d0 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
121e0 5f 69 64 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  _id", -1));..Tcl
121f0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12200 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
12210 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74  jPtr, Tcl_NewByt
12220 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f  eArrayObj(sessio
12230 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e  n_id, (int) ulen
12240 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
12250 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
12260 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
12270 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
12280 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
12290 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 54 63 6c  et, &len2);..Tcl
122a0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
122b0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
122c0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
122d0 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 5f  ingObj("session_
122e0 74 69 63 6b 65 74 22 2c 20 2d 31 29 29 3b 0a 09  ticket", -1));..
122f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12300 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12310 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
12320 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63  ByteArrayObj(tic
12330 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  ket, (int) len2)
12340 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61  );.../* Ticket a
12350 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f  pp data */..SSL_
12360 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
12370 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 73  ket_appdata(sess
12380 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
12390 65 6e 32 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  en2);..Tcl_ListO
123a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
123b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
123c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
123d0 28 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74  ("ticket_app_dat
123e0 61 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  a", -1));..Tcl_L
123f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12400 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
12410 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
12420 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
12430 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a 09  (int) len2));...
12440 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65  /* Get master ke
12450 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c  y */..len2 = SSL
12460 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73  _SESSION_get_mas
12470 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c  ter_key(session,
12480 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58   buffer, SSL_MAX
12490 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
124a0 54 48 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  TH);..Tcl_ListOb
124b0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
124c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
124d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
124e0 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 2d 31  "master_key", -1
124f0 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
12500 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12510 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
12520 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
12530 6a 28 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  j(buffer, (int) 
12540 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  len2));.    }.. 
12550 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
12560 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
12570 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
12580 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
12590 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
125a0 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
125b0 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
125c0 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
125d0 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
125e0 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
125f0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
12600 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
12610 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12620 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12630 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12640 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d  ewStringObj("com
12650 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  pression", -1));
12660 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12670 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12680 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
12690 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f 6d 70  ewStringObj(comp
126a0 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
126b0 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 4e 4f  name(comp) : "NO
126c0 4e 45 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  NE", -1));..Tcl_
126d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
126e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
126f0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
12700 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e  ngObj("expansion
12710 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
12720 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12730 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12740 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12750 4f 62 6a 28 65 78 70 6e 20 3f 20 53 53 4c 5f 43  Obj(expn ? SSL_C
12760 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70  OMP_get_name(exp
12770 6e 29 20 3a 20 22 4e 4f 4e 45 22 2c 20 2d 31 29  n) : "NONE", -1)
12780 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 4c 69  );.#else..Tcl_Li
12790 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
127a0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
127b0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
127c0 4f 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e  Obj("compression
127d0 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
127e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
127f0 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
12800 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
12810 4f 62 6a 28 22 4e 4f 4e 45 22 2c 20 2d 31 29 29  Obj("NONE", -1))
12820 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
12830 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12840 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12850 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78  NewStringObj("ex
12860 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  pansion", -1));.
12870 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
12880 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12890 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
128a0 77 53 74 72 69 6e 67 4f 62 6a 28 22 4e 4f 4e 45  wStringObj("NONE
128b0 22 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ", -1));.#endif.
128c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
128d0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
128e0 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f   mode = SSL_CTX_
128f0 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68  get_session_cach
12900 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d  e_mode(statePtr-
12910 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 6d  >ctx);.    if (m
12920 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12930 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 70 72 6f  ACHE_OFF) {..pro
12940 74 6f 20 3d 20 22 6f 66 66 22 3b 0a 20 20 20 20  to = "off";.    
12950 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
12960 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
12970 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 70 72 6f 74  _CLIENT) {..prot
12980 6f 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 20 20  o = "client";.  
12990 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64    } else if (mod
129a0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
129b0 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 70 72  HE_SERVER) {..pr
129c0 6f 74 6f 20 3d 20 22 73 65 72 76 65 72 22 3b 0a  oto = "server";.
129d0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d      } else if (m
129e0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
129f0 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 70 72  ACHE_BOTH) {..pr
12a00 6f 74 6f 20 3d 20 22 62 6f 74 68 22 3b 0a 20 20  oto = "both";.  
12a10 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72 6f 74    } else {..prot
12a20 6f 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  o = "unknown";. 
12a30 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73     }.    Tcl_Lis
12a40 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12a50 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
12a60 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12a70 62 6a 28 22 73 65 73 73 69 6f 6e 5f 63 61 63 68  bj("session_cach
12a80 65 5f 6d 6f 64 65 22 2c 20 2d 31 29 29 3b 0a 20  e_mode", -1));. 
12a90 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12aa0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12ab0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
12ac0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
12ad0 74 6f 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  to, -1));..    T
12ae0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
12af0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
12b00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12b10 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
12b20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
12b30 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
12b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
12b80 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d   VersionObjCmd -
12b90 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e  - return version
12ba0 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65   string from Ope
12bb0 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
12bc0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
12bd0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
12be0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
12bf0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
12c00 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c40 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
12c50 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  int.VersionObjCm
12c60 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
12c70 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
12c80 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
12c90 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
12ca0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
12cb0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
12cc0 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  Ptr;..    dprint
12cd0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
12ce0 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
12cf0 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e  ewStringObj(OPEN
12d00 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54  SSL_VERSION_TEXT
12d10 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53  , -1);.    Tcl_S
12d20 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12d30 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20  rp, objPtr);..  
12d40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12d50 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
12d60 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63  lientData;..objc
12d70 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d   = objc;..objv =
12d80 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a   objv;.}.../*. *
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12dd0 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62  ---. *. * MiscOb
12de0 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d  jCmd -- misc com
12df0 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  mands. *. * Resu
12e00 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
12e10 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
12e20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
12e30 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
12e40 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e80 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
12e90 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43  int.MiscObjCmd(C
12ea0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
12eb0 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
12ec0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
12ed0 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
12ee0 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
12ef0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
12f00 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20  ar *commands [] 
12f10 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72  = { "req", "strr
12f20 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
12f30 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
12f40 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c  C_REQ, C_STRREQ,
12f50 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
12f60 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a  int cmd, isStr;.
12f70 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
12f80 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72  16384];..    dpr
12f90 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
12fa0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
12fb0 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
12fc0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
12fd0 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
12fe0 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
12ff0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13000 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
13010 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
13020 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
13030 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
13040 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29  ommand", 0,&cmd)
13050 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
13060 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
13080 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
13090 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64      isStr = (cmd
130a0 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20   == C_STRREQ);. 
130b0 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d     switch ((enum
130c0 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b   command) cmd) {
130d0 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63  ..case C_REQ:..c
130e0 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a  ase C_STRREQ: {.
130f0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70  .    EVP_PKEY *p
13100 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58  key=NULL;..    X
13110 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a  509 *cert=NULL;.
13120 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a  .    X509_NAME *
13130 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  name=NULL;..    
13140 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b  Tcl_Obj **listv;
13150 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63 2c  ..    int listc,
13160 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75  i;...    BIO *ou
13170 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68  t=NULL;...    ch
13180 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54  ar *k_C="",*k_ST
13190 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f  ="",*k_L="",*k_O
131a0 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f  ="",*k_OU="",*k_
131b0 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22  CN="",*k_Email="
131c0 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65  ";..    char *ke
131d0 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74  yout,*pemout,*st
131e0 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73  r;..    int keys
131f0 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79  ize,serial=0,day
13200 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e  s=365;..#if OPEN
13210 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
13220 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
13230 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e  ..    BIGNUM *bn
13240 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52  e = NULL;..    R
13250 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a  SA *rsa = NULL;.
13260 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50  #else..    EVP_P
13270 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  KEY_CTX *ctx = N
13280 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20  ULL;.#endif...  
13290 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c    if ((objc<5) |
132a0 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09  | (objc>6)) {...
132b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
132c0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
132d0 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69  , "keysize keyfi
132e0 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66  le certfile ?inf
132f0 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  o?");...return T
13300 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
13310 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ...    if (Tcl_G
13320 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13330 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b  erp, objv[2], &k
13340 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f  eysize) != TCL_O
13350 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
13360 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
13370 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f  .    keyout=Tcl_
13380 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
13390 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d  ]);..    pemout=
133a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
133b0 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20  jv[4]);..    if 
133c0 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f  (isStr) {...Tcl_
133d0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
133e0 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63  yout,"",0);...Tc
133f0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
13400 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20  pemout,"",0);.. 
13410 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f     }...    if (o
13420 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28  bjc>=6) {...if (
13430 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
13440 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
13450 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74  bjv[5],....&list
13460 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43  c, &listv) != TC
13470 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65  L_OK) {...    re
13480 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13490 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74  ..}....if ((list
134a0 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20  c%2) != 0) {... 
134b0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
134c0 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61  (interp,"Informa
134d0 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68  tion list must h
134e0 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20  ave even number 
134f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55  of arguments",NU
13500 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
13510 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
13520 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c  ...for (i=0; i<l
13530 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09  istc; i+=2) {...
13540 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53      str=Tcl_GetS
13550 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b  tring(listv[i]);
13560 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d  ...    if (strcm
13570 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30  p(str,"days")==0
13580 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
13590 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
135a0 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
135b0 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09  days)!=TCL_OK)..
135c0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
135d0 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20  _ERROR;...    } 
135e0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
135f0 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30  str,"serial")==0
13600 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
13610 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13620 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
13630 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29  serial)!=TCL_OK)
13640 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
13650 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
13660 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13670 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b  p(str,"C")==0) {
13680 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53  ....k_C=Tcl_GetS
13690 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
136a0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
136b0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
136c0 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  ST")==0) {....k_
136d0 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ST=Tcl_GetString
136e0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
136f0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13700 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d  trcmp(str,"L")==
13710 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f  0) {....k_L=Tcl_
13720 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13730 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13740 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13750 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"O")==0) {...
13760 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_O=Tcl_GetStri
13770 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13780 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13790 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22  (strcmp(str,"OU"
137a0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d  )==0) {....k_OU=
137b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
137c0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
137d0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
137e0 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29  mp(str,"CN")==0)
137f0 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47   {....k_CN=Tcl_G
13800 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13810 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13820 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13830 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b  r,"Email")==0) {
13840 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f  ....k_Email=Tcl_
13850 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13860 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13870 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74  lse {....Tcl_Set
13880 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55  Result(interp,"U
13890 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72  nknown parameter
138a0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75  ",NULL);....retu
138b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
138c0 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d      }...}..    }
138d0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
138e0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
138f0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13900 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a  bne = BN_new();.
13910 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e  .    rsa = RSA_n
13920 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20  ew();..    pkey 
13930 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29  = EVP_PKEY_new()
13940 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d  ;..    if (bne =
13950 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d  = NULL || rsa ==
13960 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d   NULL || pkey ==
13970 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74   NULL || !BN_set
13980 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34  _word(bne,RSA_F4
13990 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65  ) ||...!RSA_gene
139a0 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c  rate_key_ex(rsa,
139b0 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e   keysize, bne, N
139c0 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45  ULL) || !EVP_PKE
139d0 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65  Y_assign_RSA(pke
139e0 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50  y, rsa)) {...EVP
139f0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
13a00 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28  ;.../* RSA_free(
13a10 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45  rsa); freed by E
13a20 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a  VP_PKEY_free */.
13a30 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
13a40 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20  #else..    pkey 
13a50 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75  = EVP_RSA_gen((u
13a60 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79  nsigned int) key
13a70 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20  size);..    ctx 
13a80 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e  = EVP_PKEY_CTX_n
13a90 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09  ew(pkey,NULL);..
13aa0 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20      if (pkey == 
13ab0 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e  NULL || ctx == N
13ac0 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ULL || !EVP_PKEY
13ad0 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78  _keygen_init(ctx
13ae0 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59  ) ||...!EVP_PKEY
13af0 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79  _CTX_set_rsa_key
13b00 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65  gen_bits(ctx, ke
13b10 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50  ysize) || !EVP_P
13b20 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20  KEY_keygen(ctx, 
13b30 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f  &pkey)) {...EVP_
13b40 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
13b50 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ...EVP_PKEY_CTX_
13b60 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69  free(ctx);.#endi
13b70 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  f...Tcl_SetResul
13b80 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
13b90 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
13ba0 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
13bb0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13bc0 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  R;..    } else {
13bd0 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a  ...if (isStr) {.
13be0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
13bf0 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a  w(BIO_s_mem());.
13c00 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
13c10 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
13c20 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
13c30 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
13c40 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
13c50 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
13c60 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
13c70 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
13c80 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
13c90 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
13ca0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13cb0 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65  erp,keyout,buffe
13cc0 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
13cd0 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
13ce0 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
13cf0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
13d00 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
13d10 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
13d20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
13d30 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74  ename(out,keyout
13d40 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
13d50 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
13d60 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
13d70 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
13d80 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f  );...    /* PEM_
13d90 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69  write_bio_RSAPri
13da0 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61  vateKey(out, rsa
13db0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c  , NULL, NULL, 0,
13dc0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f   NULL, NULL); */
13dd0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
13de0 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a  all(out);.. .}..
13df0 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39  ..if ((cert=X509
13e00 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b  _new())==NULL) {
13e10 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
13e20 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
13e30 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65  or generating ce
13e40 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73  rtificate reques
13e50 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  t",NULL);...    
13e60 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
13e70 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
13e80 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
13e90 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
13ea0 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
13eb0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72  ;.#endif...    r
13ec0 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
13ed0 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
13ee0 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
13ef0 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
13f00 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
13f10 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
13f20 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
13f30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
13f40 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65  9_getm_notBefore
13f50 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30  (cert),0);...X50
13f60 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
13f70 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28  9_getm_notAfter(
13f80 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36  cert),(long)60*6
13f90 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35  0*24*days);...X5
13fa0 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65  09_set_pubkey(ce
13fb0 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d  rt,pkey);....nam
13fc0 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  e=X509_get_subje
13fd0 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a  ct_name(cert);..
13fe0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13ff0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14000 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"C", MBSTRING_
14010 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14020 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
14030 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14040 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14050 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14060 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "ST", MBSTRING_A
14070 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14080 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54  ned char *) k_ST
14090 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
140a0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
140b0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
140c0 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "L", MBSTRING_AS
140d0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
140e0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20  ed char *) k_L, 
140f0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14100 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14110 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
14120 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14130 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14140 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31   char *) k_O, -1
14150 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14160 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14170 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22  by_txt(name,"OU"
14180 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
14190 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
141a0 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31  char *) k_OU, -1
141b0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
141c0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
141d0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22  by_txt(name,"CN"
141e0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
141f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14200 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31  char *) k_CN, -1
14210 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14220 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14230 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61  by_txt(name,"Ema
14240 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  il", MBSTRING_AS
14250 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14260 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61  ed char *) k_Ema
14270 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  il, -1, -1, 0);.
14280 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a  ...X509_set_subj
14290 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61  ect_name(cert,na
142a0 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30  me);....if (!X50
142b0 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79  9_sign(cert,pkey
142c0 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20  ,EVP_sha256())) 
142d0 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65  {...    X509_fre
142e0 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45  e(cert);...    E
142f0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
14300 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
14310 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
14320 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
14330 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
14340 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63  .#endif...    Tc
14350 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
14360 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e  rp,"Error signin
14370 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e  g certificate",N
14380 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
14390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
143a0 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20  }....if (isStr) 
143b0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
143c0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
143d0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
143e0 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63  e_bio_X509(out,c
143f0 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ert);...    i=BI
14400 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
14410 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
14420 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
14430 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
14440 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
14450 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
14460 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
14470 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
14480 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
14490 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
144a0 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
144b0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
144c0 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
144d0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
144e0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
144f0 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  pemout);...    P
14500 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
14510 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
14520 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28     BIO_free_all(
14530 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  out);...}....X50
14540 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
14550 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14560 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
14570 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
14580 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
14590 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
145a0 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ndif..    }..}..
145b0 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
145c0 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  lt:..break;.    
145d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
145e0 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
145f0 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
14600 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
14610 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69  ********/./* Ini
14620 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  t             */
14630 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14640 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
14650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14690 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65  -. *. * Tls_Free
146a0 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
146b0 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
146c0 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f  up when a SSL so
146d0 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
146e0 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20  el. *.is closed 
146f0 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63  and its referenc
14700 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65  e count falls be
14710 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75  low 1. *. * Resu
14720 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a  lts:. *.none. *.
14730 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
14740 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68  . *.Frees all th
14750 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d  e state. *. *---
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147a0 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72  . */.void.Tls_Fr
147b0 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74  ee(char *blockPt
147c0 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  r) {.    State *
147d0 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
147e0 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20  e *)blockPtr;.. 
147f0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14800 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43  ed");..    Tls_C
14810 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a  lean(statePtr);.
14820 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b      ckfree(block
14830 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
14840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14880 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65  --. *. * Tls_Cle
14890 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  an --. *. *.This
148a0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
148b0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
148c0 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
148d0 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
148e0 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
148f0 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
14900 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73  below 1.  This s
14910 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c  hould. *.be call
14920 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  ed synchronously
14930 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f   by the ClosePro
14940 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a  c, not in the. *
14950 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  .EventuallyFree 
14960 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20  callback.. *. * 
14970 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
14980 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
14990 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
149a0 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
149b0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
149c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149f0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c  ----. */.void Tl
14a00 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73  s_Clean(State *s
14a10 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64  tatePtr) {.    d
14a20 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14a30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
14a40 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
14a50 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20  here that we're 
14a60 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a  single-threaded.
14a70 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
14a80 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
14a90 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
14aa0 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
14ab0 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
14ac0 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
14ad0 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
14ae0 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20  >timer = NULL;. 
14af0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
14b00 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20  atePtr->protos) 
14b10 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50  {..ckfree(stateP
14b20 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74  tr->protos);..st
14b30 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
14b40 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14b50 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62   if (statePtr->b
14b60 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77  io) {../* This w
14b70 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75  ill call SSL_shu
14b80 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30  tdown. Bug 14140
14b90 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22  45 */..dprintf("
14ba0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29  BIO_free_all(%p)
14bb0 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ", statePtr->bio
14bc0 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  );..BIO_free_all
14bd0 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
14be0 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20  ..statePtr->bio 
14bf0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14c00 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14c10 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ssl) {..dprintf(
14c20 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20  "SSL_free(%p)", 
14c30 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
14c40 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50  .SSL_free(stateP
14c50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65  tr->ssl);..state
14c60 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b  Ptr->ssl = NULL;
14c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14c80 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a  tatePtr->ctx) {.
14c90 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74  .SSL_CTX_free(st
14ca0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73  atePtr->ctx);..s
14cb0 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e  tatePtr->ctx = N
14cc0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14cd0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
14ce0 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65  lback) {..Tcl_De
14cf0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
14d00 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
14d10 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  .statePtr->callb
14d20 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ack = NULL;.    
14d30 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
14d40 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a  tr->password) {.
14d50 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
14d60 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
14d70 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72  word);..statePtr
14d80 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c  ->password = NUL
14d90 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14da0 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
14db0 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
14dc0 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
14dd0 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  cmd);..statePtr-
14de0 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >vcmd = NULL;.  
14df0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
14e00 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d  ("Returning");.}
14e10 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
14e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
14e60 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a  * Tls_Init --. *
14e70 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61  . *.This is a pa
14e80 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61  ckage initializa
14e90 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20  tion procedure, 
14ea0 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a  which is called.
14eb0 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74   *.by Tcl when t
14ec0 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74  his package is t
14ed0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e  o be added to an
14ee0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a   interpreter.. *
14ef0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73  . * Results:  Ss
14f00 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64  l configured and
14f10 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69   loaded. *. * Si
14f20 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20  de effects:. *. 
14f30 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63  create the ssl c
14f40 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69  ommand, initiali
14f50 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20  ze ssl context. 
14f60 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45  -------. */.DLLE
14fb0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e  XPORT int Tls_In
14fc0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
14fd0 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e  nterp) {.    con
14fe0 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e  st char tlsTclIn
14ff0 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23  itScript[] = {.#
15000 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c  include "tls.tcl
15010 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b  .h"..0x00.    };
15020 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
15030 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
15040 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20  .     * We only 
15050 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34 20  support Tcl 8.4 
15060 6f 72 20 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f  or newer.     */
15070 0a 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66  .    if (.#ifdef
15080 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09   USE_TCL_STUBS..
15090 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
150a0 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a  terp, "8.4", 0).
150b0 23 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65  #else..Tcl_PkgRe
150c0 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54  quire(interp, "T
150d0 63 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a  cl", "8.4-", 0).
150e0 23 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c  #endif.. == NULL
150f0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
15100 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
15110 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74    if (TlsLibInit
15120 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  (0) != TCL_OK) {
15130 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
15140 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
15150 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  d not initialize
15160 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e   SSL library", N
15170 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
15180 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
15190 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
151a0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
151b0 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c   "tls::ciphers",
151c0 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20   CiphersObjCmd, 
151d0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
151e0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
151f0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15200 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15210 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15220 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c  ls::connection",
15230 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
15240 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
15250 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
15260 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15270 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15280 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15290 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73  erp, "tls::hands
152a0 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65  hake", Handshake
152b0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
152c0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
152d0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
152e0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
152f0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15300 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f  terp, "tls::impo
15310 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  rt", ImportObjCm
15320 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15330 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
15340 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15350 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15360 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15370 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22   "tls::unimport"
15380 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  , UnimportObjCmd
15390 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
153a0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
153b0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
153c0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
153d0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
153e0 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53  "tls::status", S
153f0 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  tatusObjCmd, (Cl
15400 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15410 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15420 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15430 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15440 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15450 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69  :version", Versi
15460 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  onObjCmd, (Clien
15470 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
15480 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
15490 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
154a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
154b0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69  interp, "tls::mi
154c0 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c  sc", MiscObjCmd,
154d0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
154e0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
154f0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15500 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15510 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15520 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c  tls::protocols",
15530 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64   ProtocolsObjCmd
15540 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
15550 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15560 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a  Proc *) NULL);..
15570 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20      if (interp) 
15580 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65  {..Tcl_Eval(inte
15590 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63  rp, tlsTclInitSc
155a0 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ript);.    }..  
155b0 20 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67    return(Tcl_Pkg
155c0 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
155d0 22 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f 56  "tls", PACKAGE_V
155e0 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ERSION));.}../*.
155f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
15630 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a  Tls_SafeInit --.
15640 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15670 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64  ------*. *.Stand
15680 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65  ard procedure re
15690 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27  quired by 'load'
156a0 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  .. *.Initializes
156b0 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20   this extension 
156c0 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72  for a safe inter
156d0 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d  preter.. *.-----
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15710 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
15720 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f  . *..As of 'Tls_
15730 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75  Init'. *. *.Resu
15740 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61  lt:. *..A standa
15750 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64  rd Tcl error cod
15760 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
157a0 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e   */.DLLEXPORT in
157b0 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54  t Tls_SafeInit(T
157c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
157d0 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  p) {.    dprintf
157e0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20  ("Called");.    
157f0 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28  return(Tls_Init(
15800 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a  interp));.}../*.
15810 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
15850 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a  TlsLibInit --. *
15860 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  ----*. *.Initial
158a0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
158b0 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63   once per applic
158c0 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  ation. *.-------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
15900 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20  .Side effects:. 
15910 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53  *..initializes S
15920 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a  SL library. *. *
15930 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e  .Result:. *..non
15940 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
15980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  */.static int Tl
15990 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69  sLibInit(int uni
159a0 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20  nitialize) {.   
159b0 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74   static int init
159c0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20  ialized = 0;.   
159d0 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43   int status = TC
159e0 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  L_OK;.#if define
159f0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15a00 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15a10 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73  L_THREADS).    s
15a20 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  ize_t num_locks;
15a30 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20  .#endif..    if 
15a40 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b  (uninitialize) {
15a50 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a  ..if (!initializ
15a60 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  ed) {..    dprin
15a70 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
15a80 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77  nitialize, but w
15a90 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61  e are not initia
15aa0 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72  lized");...    r
15ab0 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09  eturn(TCL_OK);..
15ac0 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b  }...dprintf("Ask
15ad0 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
15ae0 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ze");..#if defin
15af0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15b00 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15b10 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c  CL_THREADS)..Tcl
15b20 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
15b30 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b  _mx);...if (lock
15b40 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c  s) {..    free(l
15b50 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b  ocks);..    lock
15b60 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c  s = NULL;..    l
15b70 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09  ocksCount = 0;..
15b80 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61  }.#endif..initia
15b90 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20  lized = 0;..#if 
15ba0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15bb0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15bc0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15bd0 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
15be0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
15bf0 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  dif...return(TCL
15c00 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _OK);.    }..   
15c10 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64   if (initialized
15c20 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61  ) {..dprintf("Ca
15c30 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20  lled, but using 
15c40 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a  cached value");.
15c50 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b  .return(status);
15c60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
15c70 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
15c80 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15c90 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15ca0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15cb0 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74  ADS).    Tcl_Mut
15cc0 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
15cd0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69  ;.#endif.    ini
15ce0 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23  tialized = 1;..#
15cf0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
15d00 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
15d10 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
15d20 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b  DS).    num_lock
15d30 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73  s = 1;.    locks
15d40 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75  Count = (int) nu
15d50 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63  m_locks;.    loc
15d60 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ks = malloc(size
15d70 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d  of(*locks) * num
15d80 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d  _locks);.    mem
15d90 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69  set(locks, 0, si
15da0 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
15db0 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69  um_locks);.#endi
15dc0 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  f..    /* Initia
15dd0 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79  lize BOTH libcry
15de0 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20  pto and libssl. 
15df0 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69  */.    OPENSSL_i
15e00 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f  nit_ssl(OPENSSL_
15e10 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54  INIT_LOAD_SSL_ST
15e20 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  RINGS | OPENSSL_
15e30 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f  INIT_LOAD_CRYPTO
15e40 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e  _STRINGS..| OPEN
15e50 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
15e60 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53  _CIPHERS | OPENS
15e70 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
15e80 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a  DIGESTS, NULL);.
15e90 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  .    BIO_new_tcl
15ea0 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20  (NULL, 0);..#if 
15eb0 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  0.    /*.     * 
15ec0 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65  XXX:TODO: Remove
15ed0 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72   this code and r
15ee0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
15ef0 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f   check.     * fo
15f00 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79  r enough entropy
15f10 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20   and do not try 
15f20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
15f30 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c  n.     * terribl
15f40 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a  e entropy.     *
15f50 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  /.    /*.     * 
15f60 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20  Seed the random 
15f70 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
15f80 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72   in the SSL libr
15f90 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e  ary,.     * usin
15fa0 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63  g the do/while c
15fb0 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65  onstruct because
15fc0 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65   of the bug note
15fd0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f   in the.     * O
15fe0 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74  penSSL FAQ at ht
15ff0 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c  tp://www.openssl
16000 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71  .org/support/faq
16010 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20  .html#USER1.    
16020 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72   *.     * The cr
16030 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65  ux of the proble
16040 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69  m is that Solari
16050 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  s 7 does not hav
16060 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f  e a.     * /dev/
16070 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75  random or /dev/u
16080 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f  random device so
16090 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65   it cannot gathe
160a0 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20  r enough.     * 
160b0 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65  entropy from the
160c0 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65   RAND_seed() whe
160d0 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65  n TLS initialize
160e0 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20  s and refuses.  
160f0 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68     * to go furth
16100 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73  er. Earlier vers
16110 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20  ions of OpenSSL 
16120 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72  carried on regar
16130 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20  dless..     */. 
16140 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e     srand((unsign
16150 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69  ed int) time((ti
16160 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a  me_t *) NULL));.
16170 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69      do {..for (i
16180 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b   = 0; i < 16; i+
16190 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65  +) {..    rnd_se
161a0 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61  ed[i] = 1 + (cha
161b0 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64  r) (255.0 * rand
161c0 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30  ()/(RAND_MAX+1.0
161d0 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65  ));..}..RAND_see
161e0 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65  d(rnd_seed, size
161f0 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20  of(rnd_seed));. 
16200 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44     } while (RAND
16210 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b  _status() != 1);
16220 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
16230 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
16240 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
16250 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
16260 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
16270 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
16280 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73  ...return(status
16290 29 3b 0a 7d 0a                                   );.}.