Hex Artifact Content

Artifact 25505d8d36b326a89f2aa0c2666849ab69358657057b5913f9d35415c9442acb:


0000: 2f 2a 0a 20 2a 20 54 4c 53 20 43 68 61 6e 6e 65  /*. * TLS Channe
0010: 6c 20 2d 20 54 68 69 73 20 65 78 74 65 6e 73 69  l - This extensi
0020: 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 65 6e  on provides a en
0030: 63 72 79 70 74 65 64 20 63 6f 6d 6d 75 6e 69 63  crypted communic
0040: 61 74 69 6f 6e 20 63 68 61 6e 6e 65 6c 0a 20 2a  ation channel. *
0050: 20 75 73 69 6e 67 20 74 68 65 20 54 4c 53 20 6f   using the TLS o
0060: 72 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 73 2e  r SSL protocols.
0070: 20 49 74 20 63 61 6e 20 62 65 20 6c 61 79 65 72   It can be layer
0080: 65 64 20 6f 6e 20 74 6f 70 20 6f 66 20 61 6e 79  ed on top of any
0090: 0a 20 2a 20 62 69 2d 64 69 72 65 63 74 69 6f 6e  . * bi-direction
00a0: 61 6c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 2e 0a  al Tcl_Channel..
00b0: 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 73 20 69   *. * This was i
00c0: 6e 69 74 69 61 6c 6c 79 20 62 75 69 6c 74 20 28  nitially built (
00d0: 61 6c 6d 6f 73 74 29 20 66 72 6f 6d 20 73 63 72  almost) from scr
00e0: 61 74 63 68 20 62 61 73 65 64 20 75 70 6f 6e 20  atch based upon 
00f0: 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f 66 0a 20  observation of. 
0100: 2a 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42  * OpenSSL 0.9.2B
0110: 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68  .. *. * Copyrigh
0120: 74 20 28 43 29 20 31 39 39 37 2d 31 39 39 39 20  t (C) 1997-1999 
0130: 4d 61 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74  Matt Newman <mat
0140: 74 40 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a  t@novadigm.com>.
0150: 20 2a 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61   * some modifica
0160: 74 69 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69  tions:. *.Copyri
0170: 67 68 74 20 28 43 29 20 32 30 30 30 20 41 6a 75  ght (C) 2000 Aju
0180: 62 61 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09  ba Solutions. *.
0190: 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30  Copyright (C) 20
01a0: 30 32 20 41 63 74 69 76 65 53 74 61 74 65 20 43  02 ActiveState C
01b0: 6f 72 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f  orporation. *.Co
01c0: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 34  pyright (C) 2004
01d0: 20 53 74 61 72 66 69 73 68 20 53 79 73 74 65 6d   Starfish System
01e0: 73 0a 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28  s. *.Copyright (
01f0: 43 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27  C) 2023 Brian O'
0200: 48 61 67 61 6e 0a 20 2a 0a 20 2a 20 41 64 64 69  Hagan. *. * Addi
0210: 74 69 6f 6e 61 6c 20 63 72 65 64 69 74 20 69 73  tional credit is
0220: 20 64 75 65 20 66 6f 72 20 41 6e 64 72 65 61 73   due for Andreas
0230: 20 4b 75 70 72 69 65 73 20 28 61 2e 6b 75 70 72   Kupries (a.kupr
0240: 69 65 73 40 77 65 73 74 65 6e 64 2e 63 6f 6d 29  ies@westend.com)
0250: 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 69 64 69  , for. * providi
0260: 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 70 6c 61  ng the Tcl_Repla
0270: 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 68 61 6e  ceChannel mechan
0280: 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20  ism and working 
0290: 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 6d 65 0a  closely with me.
02a0: 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 20 69 74   * to enhance it
02b0: 20 74 6f 20 73 75 70 70 6f 72 74 20 66 75 6c 6c   to support full
02c0: 20 66 69 6c 65 65 76 65 6e 74 20 73 65 6d 61 6e   fileevent seman
02d0: 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f  tics.. *. * Also
02e0: 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 20 74 68   work done by th
02f0: 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 6c 65 20  e follow people 
0300: 70 72 6f 76 69 64 65 64 20 74 68 65 20 69 6d 70  provided the imp
0310: 65 74 75 73 20 74 6f 20 64 6f 20 74 68 69 73 20  etus to do this 
0320: 22 72 69 67 68 74 22 3a 0a 20 2a 09 74 63 6c 53  "right":. *.tclS
0330: 53 4c 20 28 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d  SL (Colin McCorm
0340: 61 63 6b 2c 20 53 68 61 72 65 64 20 54 65 63 68  ack, Shared Tech
0350: 6e 6f 6c 6f 67 79 29 0a 20 2a 09 53 53 4c 74 63  nology). *.SSLtc
0360: 6c 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29  l (Peter Antman)
0370: 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  . *. */..#includ
0380: 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e  e "tlsInt.h".#in
0390: 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 73 2e 68  clude "tclOpts.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 55  ".#include "tlsU
03b0: 75 69 64 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  uid.h".#include 
03c0: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
03d0: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
03e0: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
03f0: 73 73 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ssl.h>.#include 
0400: 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e  <openssl/crypto.
0410: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
0420: 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66  nssl/opensslconf
0430: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
0440: 65 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e  enssl/rsa.h>.#in
0450: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73  clude <openssl/s
0460: 61 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20  afestack.h>../* 
0470: 4d 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73  Min OpenSSL vers
0480: 69 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ion */.#if OPENS
0490: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
04a0: 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a  R < 0x10101000L.
04b0: 23 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65  #error "Only Ope
04c0: 6e 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c  nSSL v1.1.1 or l
04d0: 61 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65  ater is supporte
04e0: 64 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20  d".#endif.../*. 
04f0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
0500: 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66  ations. */..#def
0510: 69 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70  ine F2N(key, dsp
0520: 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20  ) \..(((key) == 
0530: 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29  NULL) ? (char *)
0540: 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f   NULL : \...Tcl_
0550: 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d  TranslateFileNam
0560: 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c  e(interp, (key),
0570: 20 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63   (dsp)))..static
0580: 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e   SSL_CTX *CTX_In
0590: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  it(State *stateP
05a0: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72  tr, int isServer
05b0: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
05c0: 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a  r *key,...char *
05d0: 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e  certfile, unsign
05e0: 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e  ed char *key_asn
05f0: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
0600: 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 54   *cert_asn1,...T
0610: 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 61 73 6e 31  cl_Size key_asn1
0620: 5f 6c 65 6e 2c 20 54 63 6c 5f 53 69 7a 65 20 63  _len, Tcl_Size c
0630: 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68  ert_asn1_len, ch
0640: 61 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72  ar *CApath, char
0650: 20 2a 43 41 73 74 6f 72 65 2c 0a 09 09 63 68 61   *CAstore,...cha
0660: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
0670: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
0680: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
0690: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
06a0: 48 70 61 72 61 6d 73 29 3b 0a 0a 23 64 65 66 69  Hparams);..#defi
06b0: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  ne TLS_PROTO_SSL
06c0: 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20  2..0x01.#define 
06d0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09  TLS_PROTO_SSL3..
06e0: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x02.#define TLS
06f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30  _PROTO_TLS1..0x0
0700: 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  4.#define TLS_PR
0710: 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a  OTO_TLS1_1.0x08.
0720: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0730: 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64  O_TLS1_2.0x10.#d
0740: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
0750: 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66  TLS1_3.0x20.#def
0760: 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67  ine ENABLED(flag
0770: 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29  , mask).(((flag)
0780: 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d   & (mask)) == (m
0790: 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53  ask))..#define S
07a0: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53  SLKEYLOGFILE.."S
07b0: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 0c  SLKEYLOGFILE"...
07c0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
07d0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62  ******/./* Callb
07e0: 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f  acks        */./
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0850: 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62   *. * Eval Callb
0860: 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20  ack Command --. 
0870: 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61  *. *.Eval callba
0880: 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63  ck command and c
0890: 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 0a  atch any errors.
08a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
08b0: 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65  *.0 = Command re
08c0: 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 65  turned fail or e
08d0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
08e0: 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f  _ERROR. *.1 = Co
08f0: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 73  mmand returned s
0900: 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 72  uccess or eval r
0910: 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20  eturned TCL_OK. 
0920: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0930: 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 20  s:. *.Evaluates 
0940: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
0950: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
09a0: 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c  atic int.EvalCal
09b0: 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70  lback(Tcl_Interp
09c0: 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 20   *interp, State 
09d0: 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f  *statePtr, Tcl_O
09e0: 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20  bj *cmdPtr) {.  
09f0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d    int code, ok =
0a00: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
0a10: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
0a20: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
0a30: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
0a40: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  p);.    Tcl_Pres
0a50: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
0a60: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
0a70: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
0a80: 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73 20  ck with success 
0a90: 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72 6e  for ok or return
0aa0: 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20 66   value 1, fail f
0ab0: 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74 75  or error or retu
0ac0: 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20 20  rn value 0 */.  
0ad0: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
0ae0: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 63  t(interp);.    c
0af0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
0b00: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
0b10: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
0b20: 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  BAL);.    dprint
0b30: 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 63 6b 3a  f("EvalCallback:
0b40: 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a 20 20 20   %d", code);.   
0b50: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
0b60: 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 65 63 6b  _OK) {../* Check
0b70: 20 72 65 73 75 6c 74 20 66 6f 72 20 72 65 74 75   result for retu
0b80: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63 6c  rn value */..Tcl
0b90: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 3d 20 54  _Obj *result = T
0ba0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
0bb0: 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 72 65  interp);..if (re
0bc0: 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  sult == NULL || 
0bd0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
0be0: 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  j(interp, result
0bf0: 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f 4b  , &ok) != TCL_OK
0c00: 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d 20 31 3b  ) {..    ok = 1;
0c10: 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 52 65  ..}..dprintf("Re
0c20: 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a  sult: %d", ok);.
0c30: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
0c40: 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20   Error - reject 
0c50: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
0c60: 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 54 63 6c  */..dprintf("Tcl
0c70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
0c80: 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ");.#if (TCL_MAJ
0c90: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
0ca0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
0cb0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
0cc0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
0cd0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
0ce0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
0cf0: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
0d00: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20   code);.#endif. 
0d10: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65     }..    Tcl_Re
0d20: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
0d30: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  a) statePtr);.  
0d40: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
0d50: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
0d60: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  p);.    return o
0d70: 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  k;.}.../*. *----
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0dc0: 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61   *. * InfoCallba
0dd0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
0de0: 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74  tors SSL connect
0df0: 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20  ion process. *. 
0e00: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
0e10: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
0e20: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
0e30: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
0e40: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0e90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49  */.static void.I
0ea0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  nfoCallback(cons
0eb0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  t SSL *ssl, int 
0ec0: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 20  where, int ret) 
0ed0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
0ee0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
0ef0: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
0f00: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20  ((SSL *)ssl);.  
0f10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0f20: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
0f30: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
0f40: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
0f50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61    const char *ma
0f60: 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20  jor, *minor;..  
0f70: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
0f80: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
0f90: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
0fa0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
0fb0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20  LL) {..return;. 
0fc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 68     }..    if (wh
0fd0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e  ere & SSL_CB_HAN
0fe0: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a  DSHAKE_START) {.
0ff0: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1000: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1010: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c  start";.    } el
1020: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1030: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f  SL_CB_HANDSHAKE_
1040: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  DONE) {..major =
1050: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1060: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20  inor = "done";. 
1070: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
1080: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1090: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20  ALERT)..major = 
10a0: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69  "alert";..else i
10b0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53  f (where & SSL_S
10c0: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72  T_CONNECT).major
10d0: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65   = "connect";..e
10e0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
10f0: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09  SSL_ST_ACCEPT)..
1100: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22  major = "accept"
1110: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f  ;..else.....majo
1120: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a  r = "unknown";..
1130: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
1140: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72  _CB_READ)..minor
1150: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65   = "read";..else
1160: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
1170: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f  _CB_WRITE)..mino
1180: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c  r = "write";..el
1190: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
11a0: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e  SL_CB_LOOP)..min
11b0: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c  or = "loop";..el
11c0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
11d0: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e  SL_CB_EXIT)..min
11e0: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c  or = "exit";..el
11f0: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22  se.....minor = "
1200: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a  unknown";.    }.
1210: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
1220: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
1230: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61  ith fn, chan, ma
1240: 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73  jor, minor, mess
1250: 61 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72  age, and type ar
1260: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
1270: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1280: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
1290: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
12a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
12c0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
12d0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
12e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
12f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1300: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1310: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1320: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
1330: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
1340: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1390: 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20  major, -1));.   
13a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
13c0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
13d0: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
13e0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
13f0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1400: 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69  ALERT) {..Tcl_Li
1410: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1420: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1430: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1440: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65  tringObj(SSL_ale
1450: 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c  rt_desc_string_l
1460: 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a  ong(ret), -1));.
1470: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1480: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1490: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
14a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14b0: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
14c0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c  tring_long(ret),
14d0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73   -1));.    } els
14e0: 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  e {..Tcl_ListObj
14f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1500: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1510: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1520: 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74  Obj(SSL_state_st
1530: 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
1540: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
1550: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1560: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1570: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1580: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
1590: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
15a0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
15b0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
15c0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
15d0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
15e0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
15f0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
1600: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1610: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
1620: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1670: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
1680: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
1690: 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20  rs SSL protocol 
16a0: 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52  messages. *. * R
16b0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
16c0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
16d0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
16e0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
16f0: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 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 0a 20 2a 2f 0a  -----------. */.
1740: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
1750: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61  NO_SSL_TRACE.sta
1760: 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65  tic void.Message
1770: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69  Callback(int wri
1780: 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f  te_p, int versio
1790: 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74  n, int content_t
17a0: 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ype, const void 
17b0: 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  *buf, size_t len
17c0: 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64  , SSL *ssl, void
17d0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
17e0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
17f0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
1800: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1810: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
1820: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
1830: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
1840: 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65  char *ver, *type
1850: 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ;.    BIO *bio;.
1860: 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
1870: 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66  15000];.    buff
1880: 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  er[0] = 0;..    
1890: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
18a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
18b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
18c0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
18d0: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ) {..return;.   
18e0: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76   }..    switch(v
18f0: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50  ersion) {.#if OP
1900: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1910: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1920: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1930: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1940: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1950: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1960: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1970: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1980: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1990: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
19a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
19b0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
19c0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
19d0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
19e0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
19f0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1a00: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1a10: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1a20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1a30: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1a40: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1a50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a60: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1a70: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1a80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1a90: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1aa0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1ab0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1ac0: 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22  case 0:..ver = "
1ad0: 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  none";..break;. 
1ae0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72     default:..ver
1af0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62   = "unknown";..b
1b00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b10: 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74   switch (content
1b20: 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73  _type) {.    cas
1b30: 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52  e SSL3_RT_HEADER
1b40: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65  :..type = "Heade
1b50: 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  r";..break;.    
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e  case SSL3_RT_INN
1b70: 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a  ER_CONTENT_TYPE:
1b80: 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20  ..type = "Inner 
1b90: 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09  Content Type";..
1ba0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1bb0: 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43  SSL3_RT_CHANGE_C
1bc0: 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70  IPHER_SPEC:..typ
1bd0: 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68  e = "Change Ciph
1be0: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  er";..break;.   
1bf0: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c   case SSL3_RT_AL
1c00: 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c  ERT:..type = "Al
1c10: 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ert";..break;.  
1c20: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48    case SSL3_RT_H
1c30: 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20  ANDSHAKE:..type 
1c40: 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09  = "Handshake";..
1c50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c60: 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54  SSL3_RT_APPLICAT
1c70: 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20  ION_DATA:..type 
1c80: 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62  = "App Data";..b
1c90: 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53  reak;.#if OPENSS
1ca0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
1cb0: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20   < 0x30000000L. 
1cc0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1cd0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1ce0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1cf0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1d00: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79      default:..ty
1d10: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  pe = "unknown";.
1d20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65      }..    /* Ne
1d30: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  eds compile time
1d40: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d   option "enable-
1d50: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20  ssl-trace". */. 
1d60: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49     if ((bio = BI
1d70: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
1d80: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
1d90: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63  int n;..SSL_trac
1da0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69  e(write_p, versi
1db0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65  on, content_type
1dc0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c  , buf, len, ssl,
1dd0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09   (void *)bio);..
1de0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f  n = BIO_read(bio
1df0: 2c 20 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65  , buffer, BIO_pe
1e00: 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30  nding(bio) < 150
1e10: 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67  00 ? BIO_pending
1e20: 28 62 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a  (bio) : 14999);.
1e30: 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a  .n = (n<0) ? 0 :
1e40: 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d   n;..buffer[n] =
1e50: 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66   0;..(void)BIO_f
1e60: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f  lush(bio);..BIO_
1e70: 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a  free(bio);.   }.
1e80: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 4d 65  .    dprintf("Me
1e90: 73 73 61 67 65 20 64 69 72 65 63 74 69 6f 6e 3d  ssage direction=
1ea0: 25 64 2c 20 76 65 72 3d 25 73 2c 20 74 79 70 65  %d, ver=%s, type
1eb0: 3d 25 73 2c 20 6d 65 73 73 61 67 65 3d 25 73 22  =%s, message=%s"
1ec0: 2c 20 77 72 69 74 65 5f 70 2c 20 76 65 72 2c 20  , write_p, ver, 
1ed0: 74 79 70 65 2c 20 26 62 75 66 66 65 72 5b 30 5d  type, &buffer[0]
1ee0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
1ef0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
1f00: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
1f10: 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72 73   direction, vers
1f20: 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d  ion, type, and m
1f30: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
1f40: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
1f50: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
1f60: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
1f70: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1f80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1f90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1fa0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1fb0: 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b  "message", -1));
1fc0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1fd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1fe0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1ff0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
2000: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
2010: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
2020: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
2030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2040: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2050: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2060: 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74  ewStringObj(writ
2070: 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22  e_p ? "Sent" : "
2080: 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b  Received", -1));
2090: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
20a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
20b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
20c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76  l_NewStringObj(v
20d0: 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  er, -1));.    Tc
20e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
20f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2100: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2110: 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31  ringObj(type, -1
2120: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2130: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2140: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2150: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2160: 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a  j(buffer, -1));.
2170: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
2180: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
2190: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
21a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
21b0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
21c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
21d0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
21e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
21f0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69  cmdPtr);.}.#endi
2200: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  f.../*. *-------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2250: 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63   * VerifyCallbac
2260: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74  k --. *. *.Monit
2270: 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63  ors SSL certific
2280: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70  ate validation p
2290: 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20  rocess. Used to 
22a0: 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62  control the. *.b
22b0: 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65  ehavior when the
22c0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
22d0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
22e0: 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  is is called. *.
22f0: 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69  whenever a certi
2300: 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63  ficate is inspec
2310: 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69  ted or decided i
2320: 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66  nvalid. Called f
2330: 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69  or. *.each certi
2340: 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65  ficate in the ce
2350: 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20  rt chain.. *. * 
2360: 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68 65 20 63  Checks:. *.The c
2370: 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e  ertificate chain
2380: 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72   is checked star
2390: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65  ting with the de
23a0: 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65  epest nesting le
23b0: 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f  vel. *.  (the ro
23c0: 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74  ot CA certificat
23d0: 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70  e) and worked up
23e0: 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72  ward to the peer
23f0: 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a  's certificate..
2400: 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65   *.All signature
2410: 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72  s are valid, cur
2420: 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74  rent time is wit
2430: 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61  hin first and la
2440: 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65  st validity time
2450: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20  .. *.Check that 
2460: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2470: 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65  is issued by the
2480: 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63   issuer certific
2490: 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43  ate issuer.. *.C
24a0: 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74  heck the revocat
24b0: 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65  ion status for e
24c0: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e  ach certificate.
24d0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61  . *.Check the va
24e0: 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69  lidity of the gi
24f0: 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20  ven CRL and the 
2500: 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20  cert revocation 
2510: 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b  status.. *.Check
2520: 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66   the policies of
2530: 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69   all the certifi
2540: 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73  cates. *. * Args
2550: 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b  . *.preverify_ok
2560: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68   indicates wheth
2570: 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61  er the certifica
2580: 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  te verification 
2590: 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f  passed (1) or no
25a0: 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75  t (0). *. * Resu
25b0: 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61  lts:. *.A callba
25c0: 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ck bound to the 
25d0: 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72  socket may retur
25e0: 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20  n one of:. *.   
25f0: 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   0...- the certi
2600: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
2610: 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76   invalid, send v
2620: 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09  erification. *..
2630: 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72  ..  failure aler
2640: 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74  t to peer, and t
2650: 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61  erminate handsha
2660: 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d  ke.. *.    1...-
2670: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
2680: 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64   is deemed valid
2690: 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  , continue with 
26a0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20  handshake.. *.  
26b0: 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d    empty string.-
26c0: 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65   no change to ce
26d0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
26e0: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  tion. *. * Side 
26f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
2700: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
2710: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
2720: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
2730: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
2740: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
2750: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
2760: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
2770: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
27c0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43  atic int.VerifyC
27d0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20  allback(int ok, 
27e0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a  X509_STORE_CTX *
27f0: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ctx) {.    Tcl_O
2800: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
2810: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53  SSL   *ssl..= (S
2820: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43  SL*)X509_STORE_C
2830: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63  TX_get_ex_data(c
2840: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64  tx, SSL_get_ex_d
2850: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43  ata_X509_STORE_C
2860: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58  TX_idx());.    X
2870: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35  509  *cert..= X5
2880: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2890: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74  _current_cert(ct
28a0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  x);.    State *s
28b0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
28c0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
28d0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c  ta(ssl);.    Tcl
28e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
28f0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2900: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74  rp;.    int dept
2910: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  h..= X509_STORE_
2920: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65  CTX_get_error_de
2930: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e  pth(ctx);.    in
2940: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54  t err..= X509_ST
2950: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f  ORE_CTX_get_erro
2960: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72  r(ctx);..    dpr
2970: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
2980: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2990: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22  ifyCallback: %d"
29a0: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28  , ok);..    if (
29b0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
29c0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
29d0: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76  ) {../* Use ok v
29e0: 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 61  alue if verifica
29f0: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2a00: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74   */..if (statePt
2a10: 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f  r->vflags & SSL_
2a20: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
2a30: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09  O_PEER_CERT) {..
2a40: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09      return ok;..
2a50: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
2a60: 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d  turn 1;..}.    }
2a70: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 3d   else if (cert =
2a80: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d  = NULL || ssl ==
2a90: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
2aa0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   0;.    }..    d
2ab0: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61  printf("VerifyCa
2ac0: 6c 6c 62 61 63 6b 3a 20 63 72 65 61 74 65 20 63  llback: create c
2ad0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22  allback command"
2ae0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
2af0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
2b00: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
2b10: 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66   depth, cert inf
2b20: 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20  o list, status, 
2b30: 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a  and error args *
2b40: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
2b50: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2b60: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
2b70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2b80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2b90: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2ba0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2bb0: 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20  verify", -1));. 
2bc0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2bd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2be0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
2bf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
2c00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
2c10: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
2c20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2c30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2c50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
2c60: 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20  bj(depth));.    
2c70: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c80: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c90: 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77   cmdPtr, Tls_New
2ca0: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20  X509Obj(interp, 
2cb0: 63 65 72 74 2c 20 30 29 29 3b 0a 20 20 20 20 54  cert, 0));.    T
2cc0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2cd0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2ce0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2cf0: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20  ntObj(ok));.    
2d00: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2d10: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2d20: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2d30: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
2d40: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  *)X509_verify_ce
2d50: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
2d60: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  err), -1));..   
2d70: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20   /* Prevent I/O 
2d80: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69  while callback i
2d90: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f  s in progress */
2da0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2db0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2dc0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a  CL_CALLBACK; */.
2dd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65  .    dprintf("Ve
2de0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76  rifyCallback: ev
2df0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a  al callback");..
2e00: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
2e10: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
2e20: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
2e30: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
2e40: 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c 62    ok = EvalCallb
2e50: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
2e60: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
2e70: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2e80: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20  unt(cmdPtr);..  
2e90: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66    dprintf("Verif
2ea0: 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61  yCallback: comma
2eb0: 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 2c  nd result = %d",
2ec0: 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74   ok);..    /* st
2ed0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  atePtr->flags &=
2ee0: 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42   ~(TLS_TCL_CALLB
2ef0: 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  ACK); */.    ret
2f00: 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64 65  urn ok;./* By de
2f10: 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72  fault, leave ver
2f20: 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e  ification unchan
2f30: 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20  ged. */.}.../*. 
2f40: 2a 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 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45  ----. *. * Tls_E
2f90: 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  rror --. *. *.Ca
2fa0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  lls callback wit
2fb0: 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  h error message.
2fc0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2fd0: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20  cts:. *.The err 
2fe0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72  field of the cur
2ff0: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65  rently operative
3000: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a   State is set. *
3010: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64  .  to a string d
3020: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53  escribing the SS
3030: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61  L negotiation fa
3040: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a  ilure reason. *.
3050: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
30a0: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a  ls_Error(State *
30b0: 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 20  statePtr, const 
30c0: 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20  char *msg) {.   
30d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
30e0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
30f0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
3100: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69  Obj *cmdPtr, *li
3110: 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67  stPtr;.    unsig
3120: 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20  ned long err;.  
3130: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
3140: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69  = msg;..    dpri
3150: 6e 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68  ntf("Called with
3160: 20 6d 65 73 73 61 67 65 20 25 73 22 2c 20 6d 73   message %s", ms
3170: 67 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  g);..    if (sta
3180: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
3190: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
31a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
31b0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
31c0: 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 63 72 65  ("Tls_Error: cre
31d0: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  ate callback com
31e0: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  mand");..    /* 
31f0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3200: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
3210: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67  chan, and messag
3220: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3230: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3240: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3250: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
3260: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3270: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3280: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3290: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f  wStringObj("erro
32a0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
32b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
32c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
32d0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
32e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
32f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
3300: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
3310: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d   -1));.    if (m
3320: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  sg != NULL) {..T
3330: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3340: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3350: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3360: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
3370: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
3380: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47  if ((msg = Tcl_G
3390: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74  etString(Tcl_Get
33a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
33b0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
33c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
33d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
33e0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
33f0: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3400: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3410: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3420: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3430: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
3440: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
3450: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
3460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3480: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
3490: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
34a0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
34b0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
34c0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
34d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
34e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
34f0: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3500: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c  .    dprintf("Tl
3510: 73 5f 45 72 72 6f 72 3a 20 65 76 61 6c 20 63 61  s_Error: eval ca
3520: 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f  llback");..    /
3530: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
3540: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
3550: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
3560: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
3570: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
3580: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
3590: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
35a0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
35b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 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 0a  ---------------.
3600: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c   *. * KeyLogCall
3610: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72  back --. *. *.Wr
3620: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79  ite received key
3630: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c   data to log fil
3640: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
3650: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  fects:. *.none. 
3660: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
36b0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28   KeyLogCallback(
36c0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
36d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65  const char *line
36e0: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74  ) {.    char *st
36f0: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45  r = getenv(SSLKE
3700: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46  YLOGFILE);.    F
3710: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70  ILE *fd;..    dp
3720: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
3730: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b  ..    if (str) {
3740: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72  ..fd = fopen(str
3750: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66  , "a");..fprintf
3760: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65  (fd, "%s\n",line
3770: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a  );..fclose(fd);.
3780: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72  --. *. * Passwor
37e0: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  d Callback --. *
37f0: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20  . *.Called when 
3800: 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65  a password is ne
3810: 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 61  eded for a priva
3820: 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 64  te key when load
3830: 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 6e  ing. *.or storin
3840: 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 63  g a PEM certific
3850: 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74  ate with encrypt
3860: 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62  ion. Evals callb
3870: 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 6e  ack. *.script an
3880: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65  d returns the re
3890: 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73  sult as the pass
38a0: 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62  word string in b
38b0: 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  uf.. *. * Result
38c0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
38d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
38e0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
38f0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
3900: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
3910: 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e  Password size in
3920: 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72   bytes or -1 for
3930: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a   an error.. *. *
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
3990: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  nt.PasswordCallb
39a0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69  ack(char *buf, i
39b0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66  nt size, int rwf
39c0: 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61  lag, void *udata
39d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
39e0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
39f0: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54   *) udata;.    T
3a00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3a10: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
3a20: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
3a30: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
3a40: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 6c  nt code;.    Tcl
3a50: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 20  _Size len;..    
3a60: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3a70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  );..    /* If no
3a80: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64   callback, use d
3a90: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20  efault callback 
3aa0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
3ab0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d  Ptr->password ==
3ac0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63   NULL) {..if (Tc
3ad0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c  l_EvalEx(interp,
3ae0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
3af0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  , -1, TCL_EVAL_G
3b00: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b  LOBAL) == TCL_OK
3b10: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72  ) {..    char *r
3b20: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3b30: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3b40: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3b50: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65  ult(interp), &le
3b60: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  n);..    if (len
3b70: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   > (Tcl_Size) si
3b80: 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d 20  ze-1) {...len = 
3b90: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d  (Tcl_Size) size-
3ba0: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73  1;..    }..    s
3bb0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
3bc0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
3bd0: 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d 20  .    buf[len] = 
3be0: 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 72  '\0';..    retur
3bf0: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20  n (int) len;..} 
3c00: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75  else {..    retu
3c10: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a  rn -1;..}.    }.
3c20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 50 61  .    dprintf("Pa
3c30: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 3a 20  sswordCallback: 
3c40: 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63 6b 20  create callback 
3c50: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20  command");..    
3c60: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3c70: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
3c80: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73  n, rwflag, and s
3c90: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ize args */.    
3ca0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
3cb0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
3cc0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20  tr->password);. 
3cd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3ce0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3cf0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3d00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61  NewStringObj("pa
3d10: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20  ssword", -1));. 
3d20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3d50: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67  NewIntObj(rwflag
3d60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3d70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3d80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d90: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
3da0: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 64 70 72 69  ize));..    dpri
3db0: 6e 74 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c  ntf("PasswordCal
3dc0: 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c  lback: eval call
3dd0: 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 54 63 6c  back");..    Tcl
3de0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3df0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3e00: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3e10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
3e20: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
3e30: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
3e40: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
3e50: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
3e60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65  mdPtr);.    code
3e70: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
3e80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3e90: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3ea0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
3eb0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66  != TCL_OK) {.#if
3ec0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
3ed0: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43  ION == 8) && (TC
3ee0: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
3ef0: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72  < 6)..Tcl_Backgr
3f00: 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70  oundError(interp
3f10: 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61  );.#else..Tcl_Ba
3f20: 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f  ckgroundExceptio
3f30: 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b  n(interp, code);
3f40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
3f50: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3f60: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
3f70: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
3f80: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
3f90: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  tr);..    /* If 
3fa0: 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73  successful, pass
3fb0: 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73   back password s
3fc0: 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61  tring and trunca
3fd0: 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a  te if too long *
3fe0: 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  /.    if (code =
3ff0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61  = TCL_OK) {..cha
4000: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a  r *ret = (char *
4010: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
4020: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62  romObj(Tcl_GetOb
4030: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  jResult(interp),
4040: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
4050: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   > (Tcl_Size) si
4060: 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e  ze-1) {..    len
4070: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   = (Tcl_Size) si
4080: 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70  ze-1;..}..strncp
4090: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
40a0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b  e_t) len);..buf[
40b0: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63  len] = '\0';..Tc
40c0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
40d0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
40e0: 09 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65  .return (int) le
40f0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  n;.    }.    Tcl
4100: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
4110: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
4120: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a     return -1;.}.
4130: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4180: 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63   Session Callbac
4190: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d  k for Clients --
41a0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68  . *. *.Called wh
41b0: 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
41c0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
41d0: 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31   cache. In TLS 1
41e0: 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62  .3. *.this may b
41f0: 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69  e received multi
4200: 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20  ple times after 
4210: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46  the handshake. F
4220: 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65  or. *.earlier ve
4230: 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c  rsions, this wil
4240: 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75  l be received du
4250: 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61  ring the handsha
4260: 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74  ke.. *.This is t
4270: 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79  he preferred way
4280: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73   to obtain a res
4290: 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a  umable session..
42a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
42b0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
42c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
42d0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
42e0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
42f0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4300: 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65  .0 = error where
4310: 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65   session will be
4320: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d   immediately rem
4330: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  oved from the in
4340: 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a  ternal cache.. *
4350: 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65  .1 = success whe
4360: 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73  re app retains s
4370: 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f  ession in sessio
4380: 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73  n cache, and mus
4390: 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49  t call SSL_SESSI
43a0: 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64  ON_free() when d
43b0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4400: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73  /.static int.Ses
4410: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c  sionCallback(SSL
4420: 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49   *ssl, SSL_SESSI
4430: 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20  ON *session) {. 
4440: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4450: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
4460: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
4470: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
4480: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4490: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
44a0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
44b0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
44c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
44d0: 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20  ar *ticket;.    
44e0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
44f0: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b  har *session_id;
4500: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32  .    size_t len2
4510: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
4520: 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70  nt ulen;..    dp
4530: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
4540: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
4550: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
4560: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4570: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
4580: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4590: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20   } else if (ssl 
45a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
45b0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
45c0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
45d0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
45e0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
45f0: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73  th fn, chan, ses
4600: 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e  sion id, session
4610: 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66   ticket, and lif
4620: 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20  etime args */.  
4630: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
4640: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
4650: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
4660: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4670: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4680: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4690: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
46a0: 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  session", -1));.
46b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
46c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
46d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
46e0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
46f0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
4700: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
4710: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  self), -1));..  
4720: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20    /* Session id 
4730: 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69  */.    session_i
4740: 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
4750: 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
4760: 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  &ulen);.    Tcl_
4770: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4780: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4790: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
47a0: 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e  ArrayObj(session
47b0: 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  _id, (Tcl_Size) 
47c0: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ulen));..    /* 
47d0: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
47e0: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
47f0: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
4800: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
4810: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
4820: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4830: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4840: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
4850: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
4860: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
4870: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65  ));..    /* Life
4880: 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66  time - number of
4890: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20   seconds */.    
48a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
48b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
48c0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
48d0: 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20  wLongObj((long) 
48e0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
48f0: 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
4900: 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b  hint(session)));
4910: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
4920: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
4930: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
4940: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4950: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
4960: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4970: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
4980: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4990: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f  (cmdPtr);..    /
49a0: 2a 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e  * Return 0 for n
49b0: 6f 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e  ow until session
49c0: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d   handling is com
49d0: 70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74  plete */.    ret
49e0: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  urn 0;.}.../*. *
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43  ---. *. * ALPN C
4a40: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
4a50: 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c  ers and NPN Call
4a60: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73  back for Clients
4a70: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
4a80: 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70  m protocol (http
4a90: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74  /1.1, h2, h3, et
4aa0: 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f  c.) selection fo
4ab0: 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e  r the. *.incomin
4ac0: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61  g connection. Ca
4ad0: 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f  lled after Hello
4ae0: 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c   and server call
4af0: 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20  backs.. *.Where 
4b00: 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65  'out' is selecte
4b10: 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27  d protocol and '
4b20: 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20  in' is the peer 
4b30: 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e  advertised list.
4b40: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
4b50: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
4b60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4b70: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
4b80: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
4b90: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
4ba0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
4bb0: 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63  _OK: ALPN protoc
4bc0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
4bd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
4be0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
4bf0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
4c00: 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20  ATAL: There was 
4c10: 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  no overlap betwe
4c20: 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a  en the client's.
4c30: 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20   *.    supplied 
4c40: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72  list and the ser
4c50: 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ver configuratio
4c60: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  n. The connectio
4c70: 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65  n will be aborte
4c80: 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  d.. *.SSL_TLSEXT
4c90: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e  _ERR_NOACK: ALPN
4ca0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65   protocol not se
4cb0: 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65  lected, e.g., be
4cc0: 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a  cause no ALPN. *
4cd0: 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61  .    protocols a
4ce0: 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  re configured fo
4cf0: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
4d00: 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  n. The connectio
4d10: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
4d20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
4d70: 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63   int.ALPNCallbac
4d80: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  k(SSL *ssl, cons
4d90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4da0: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
4db0: 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63  char *outlen,..c
4dc0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4dd0: 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64  ar *in, unsigned
4de0: 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64   int inlen, void
4df0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
4e00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
4e10: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
4e20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4e30: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
4e40: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4e50: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4e60: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a  int code, res;..
4e70: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
4e80: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
4e90: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
4ea0: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
4eb0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4ec0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4ed0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  }..    /* Select
4ee0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
4ef0: 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f   if (SSL_select_
4f00: 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69  next_proto((unsi
4f10: 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75  gned char **) ou
4f20: 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65  t, outlen, state
4f30: 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61  Ptr->protos, sta
4f40: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
4f50: 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d  n,..in, inlen) =
4f60: 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45  = OPENSSL_NPN_NE
4f70: 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20  GOTIATED) {../* 
4f80: 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09  Match found */..
4f90: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
4fa0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65  _ERR_OK;.    } e
4fb0: 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53  lse {../* OPENSS
4fc0: 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50  L_NPN_NO_OVERLAP
4fd0: 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73   = No overlap, s
4fe0: 6f 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d  o use first item
4ff0: 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f   from client pro
5000: 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72  tocol list */..r
5010: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5020: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5030: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
5040: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
5050: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
5060: 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d  eturn res;.    }
5070: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
5080: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
5090: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64  with fn, chan, d
50a0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20  epth, cert info 
50b0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e  list, status, an
50c0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a  d error args */.
50d0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
50e0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
50f0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
5100: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5110: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5120: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5130: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
5140: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
5150: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5160: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5170: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
5180: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
5190: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
51a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
51b0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
51c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
51d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
51e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
51f0: 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61  ngObj((const cha
5200: 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b  r *) *out, -1));
5210: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5220: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5230: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
5240: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
5250: 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58  res == SSL_TLSEX
5260: 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20  T_ERR_OK));..   
5270: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
5280: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
5290: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
52a0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
52b0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
52c0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
52d0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
52e0: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
52f0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5300: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  NOACK;.    } els
5310: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
5320: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5330: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
5340: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
5350: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5360: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20  ALERT_FATAL;.   
5370: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
5380: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5390: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
53a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
53f0: 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72  . * Advertise Pr
5400: 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b  otocols Callback
5410: 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63   for Next Protoc
5420: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28  ol Negotiation (
5430: 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65  NPN) in ServerHe
5440: 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c  llo --. *. *.cal
5450: 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73  led when a TLS s
5460: 65 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69  erver needs a li
5470: 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20  st of supported 
5480: 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65  protocols for Ne
5490: 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e  xt. *.Protocol N
54a0: 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20  egotiation.. *. 
54b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
54c0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
54d0: 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74  fects:. *. * Ret
54e0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
54f0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
5500: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65   NPN protocol se
5510: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
5520: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5530: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5540: 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70  ERR_NOACK: NPN p
5550: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65  rotocol not sele
5560: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
5570: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5580: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66  --------. */.#if
55d0: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74  def USE_NPN.stat
55e0: 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61  ic int.NPNCallba
55f0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
5600: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
5610: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
5620: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c  signed int *outl
5630: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
5640: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5650: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5660: 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  rg;..    dprintf
5670: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
5680: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
5690: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
56a0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
56b0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
56c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
56d0: 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  et protocols lis
56e0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  t */.    if (sta
56f0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
5700: 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d   NULL) {..*out =
5710: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
5720: 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74  s;..*outlen = st
5730: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
5740: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  en;.    } else {
5750: 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09  ..*out = NULL;..
5760: 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65  *outlen = 0;..re
5770: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5780: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f  .    return SSL_
57a0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d  TLSEXT_ERR_OK;.}
57b0: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5800: 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c  --. *. * SNI Cal
5810: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
5820: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f  s --. *. *.Perfo
5830: 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53  rm server-side S
5840: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65  NI hostname sele
5850: 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65  ction after rece
5860: 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73  iving SNI extens
5870: 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74  ion. *.in Client
5880: 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61   Hello. Called a
5890: 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62  fter hello callb
58a0: 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41  ack but before A
58b0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  LPN callback.. *
58c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
58d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
58e0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
58f0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
5900: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
5910: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
5920: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5930: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5940: 73 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  s accepted. The 
5950: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
5960: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
5970: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
5980: 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  TAL: SNI hostnam
5990: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
59a0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
59b0: 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72  n. *.    is abor
59c0: 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72  ted. Default for
59d0: 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44   alert is SSL_AD
59e0: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41  _UNRECOGNIZED_NA
59f0: 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  ME.. *.SSL_TLSEX
5a00: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e  T_ERR_ALERT_WARN
5a10: 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ING: SNI hostnam
5a20: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
5a30: 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74  d, warning alert
5a40: 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f  . *.    sent (no
5a50: 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54  t supported in T
5a60: 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e  LSv1.3). The con
5a70: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
5a80: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
5a90: 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20  _ERR_NOACK: SNI 
5aa0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20  hostname is not 
5ab0: 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74  accepted and not
5ac0: 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20   acknowledged,. 
5ad0: 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e  *.    e.g. if SN
5ae0: 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  I has not been c
5af0: 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63  onfigured. The c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5b10: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49  /.static int.SNI
5b70: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
5b80: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
5b90: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
5ba0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
5bb0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
5bc0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
5bd0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
5be0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
5bf0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
5c00: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
5c10: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73  e, res;.    cons
5c20: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61  t char *serverna
5c30: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  me = NULL;..    
5c40: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
5c50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20  );..    if (ssl 
5c60: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d  == NULL || arg =
5c70: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
5c80: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5c90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
5ca0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73     /* Only works
5cb0: 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64   for TLS 1.2 and
5cc0: 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20   earlier */.    
5cd0: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c  servername = SSL
5ce0: 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28  _get_servername(
5cf0: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45  ssl, TLSEXT_NAME
5d00: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b  TYPE_host_name);
5d10: 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72  .    if (!server
5d20: 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61  name || serverna
5d30: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b  me[0] == '\0') {
5d40: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5d50: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
5d60: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
5d70: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
5d80: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
5d90: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5da0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
5db0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
5dc0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
5dd0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
5de0: 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65   and server name
5df0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
5e00: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
5e10: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
5e20: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5e50: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5e60: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29  ngObj("sni", -1)
5e70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5e80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5e90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
5ea0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
5eb0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
5ec0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
5ed0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
5ee0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5ef0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5f00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5f10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65  _NewStringObj(se
5f20: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b  rvername , -1));
5f30: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5f40: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5f50: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5f60: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5f70: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5f80: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5f90: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5fa0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
5fb0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5fc0: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
5fd0: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  NG;..*alert = SS
5fe0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5ff0: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
6000: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
6010: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73  1.3 */.    } els
6020: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
6030: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
6040: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
6050: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
6060: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
6070: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61  ALERT_FATAL;..*a
6080: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e  lert = SSL_AD_UN
6090: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b  RECOGNIZED_NAME;
60a0: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65   /* Not supporte
60b0: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a  d by TLS 1.3 */.
60c0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
60d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
60e0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
60f0: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  es;.}.../*. *---
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c  . *. * ClientHel
6150: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c  lo Handshake Cal
6160: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
6170: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20  s --. *. *.Used 
6180: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61  by server to exa
6190: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20  mine the server 
61a0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
61b0: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a  (SNI) extension.
61c0: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74   *.provided by t
61d0: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64  he client in ord
61e0: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20  er to select an 
61f0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74  appropriate cert
6200: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72  ificate to. *.pr
6210: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20  esent, and make 
6220: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
6230: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ion adjustments 
6240: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74  relevant to that
6250: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20   server. *.name 
6260: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72  and its configur
6270: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c  ation. This incl
6280: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75  udes swapping ou
6290: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
62a0: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e  . *.SSL_CTX poin
62b0: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74  ter, modifying t
62c0: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74  he server's list
62d0: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c   of permitted TL
62e0: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63  S versions,. *.c
62f0: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76  hanging the serv
6300: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74  er's cipher list
6310: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
6320: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70  the client's cip
6330: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20  her list, etc.. 
6340: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  *.Called before 
6350: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c  SNI and ALPN cal
6360: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65  lbacks.. *. * Re
6370: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
6380: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6390: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
63a0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
63b0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
63c0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49  odes:. *.SSL_CLI
63d0: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a  ENT_HELLO_RETRY:
63e0: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e   suspend the han
63f0: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20  dshake, and the 
6400: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69  handshake functi
6410: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69  on will return i
6420: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53  mmediately. *.SS
6430: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6440: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74  RROR: failure, t
6450: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74  erminate connect
6460: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74  ion. Set alert t
6470: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  o error code.. *
6480: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
6490: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65  O_SUCCESS: succe
64a0: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ss. *. *--------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
64f0: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f  static int.Hello
6500: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73  Callback(SSL *ss
6510: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
6520: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
6530: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
6540: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
6550: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
6560: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
6570: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
6580: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
6590: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73     int code, res
65a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
65b0: 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20   *servername;.  
65c0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
65d0: 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69   char *p;.    si
65e0: 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e  ze_t len, remain
65f0: 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ing;..    dprint
6600: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
6610: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
6620: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
6630: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
6640: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6650: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
6660: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
6670: 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e  = (const SSL *)N
6680: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76  ULL || arg == (v
6690: 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  oid *)NULL) {..r
66a0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
66b0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
66c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
66d0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20  names */.    if 
66e0: 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c  (!SSL_client_hel
66f0: 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c  lo_get0_ext(ssl,
6700: 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72   TLSEXT_TYPE_ser
6710: 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72  ver_name, &p, &r
6720: 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d  emaining) || rem
6730: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09  aining <= 2) {..
6740: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53  *alert = SSL_R_S
6750: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47  SLV3_ALERT_ILLEG
6760: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72  AL_PARAMETER;..r
6770: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6780: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6790: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
67a0: 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  act the length o
67b0: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c  f the supplied l
67c0: 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f  ist of names. */
67d0: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b  .    len = (*(p+
67e0: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65  +) << 8);.    le
67f0: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20  n += *(p++);.   
6800: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20   if (len + 2 != 
6810: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
6820: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c  lert = SSL_R_SSL
6830: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c  V3_ALERT_ILLEGAL
6840: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74  _PARAMETER;..ret
6850: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6860: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6870: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20  }.    remaining 
6880: 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54  = len;..    /* T
6890: 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74  he list in pract
68a0: 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73  ice only has a s
68b0: 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73  ingle element, s
68c0: 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  o we only consid
68d0: 65 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  er the first one
68e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d  . */.    if (rem
68f0: 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a  aining == 0 || *
6900: 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41  p++ != TLSEXT_NA
6910: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
6920: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6930: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6940: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6950: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6960: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6970: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6980: 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ing--;..    /* N
6990: 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c  ow we can finall
69a0: 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62  y pull out the b
69b0: 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74  yte array with t
69c0: 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61  he actual hostna
69d0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72  me. */.    if (r
69e0: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b  emaining <= 2) {
69f0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6a00: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
6a10: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
6a20: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6a30: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6a40: 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28   }.    len = (*(
6a50: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20  p++) << 8);.    
6a60: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20  len += *(p++);. 
6a70: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e     if (len + 2 >
6a80: 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a   remaining) {..*
6a90: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6aa0: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6ab0: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6ac0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6ad0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6ae0: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20      remaining = 
6af0: 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e  len;.    servern
6b00: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
6b10: 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43  r *)p;..    /* C
6b20: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
6b30: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
6b40: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20  han, and server 
6b50: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  name args */.   
6b60: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
6b70: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
6b80: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
6b90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6ba0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6bb0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
6bc0: 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f  StringObj("hello
6bd0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
6be0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6bf0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6c00: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
6c10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
6c20: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
6c30: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
6c40: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
6c50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6c60: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
6c70: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6c80: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20  Obj(servername, 
6c90: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29  (Tcl_Size) len))
6ca0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
6cb0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
6cc0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
6cd0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
6ce0: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
6cf0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
6d00: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
6d10: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
6d20: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e  .res = SSL_CLIEN
6d30: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09  T_HELLO_RETRY;..
6d40: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6d50: 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f  LSV1_ALERT_USER_
6d60: 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d  CANCELLED;.    }
6d70: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
6d80: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
6d90: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
6da0: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c  UCCESS;.    } el
6db0: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
6dc0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6dd0: 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  OR;..*alert = SS
6de0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6df0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6e00: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
6e10: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
6e20: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
6e30: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  es;.}.../*******
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
6e50: 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20  * Commands      
6e60: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
6e80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70  ------. *. * Cip
6ed0: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  hersObjCmd -- li
6ee0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
6ef0: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  hers. *. *.This 
6f00: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
6f10: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
6f20: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  the "tls::cipher
6f30: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
6f40: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
6f50: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75  ciphers, based u
6f60: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  pon protocol sel
6f70: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  ected.. *. * Res
6f80: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
6f90: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c  ard Tcl result l
6fa0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
6fb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
6fc0: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72  tructs and destr
6fd0: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  oys SSL context 
6fe0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7030: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7040: 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b  char *protocols[
7050: 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22  ] = {.."ssl2", "
7060: 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22  ssl3", "tls1", "
7070: 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32  tls1.1", "tls1.2
7080: 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c  ", "tls1.3", NUL
7090: 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63  L.};.enum protoc
70a0: 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c  ol {.    TLS_SSL
70b0: 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53  2, TLS_SSL3, TLS
70c0: 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  _TLS1, TLS_TLS1_
70d0: 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54  1, TLS_TLS1_2, T
70e0: 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e  LS_TLS1_3, TLS_N
70f0: 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69  ONE.};..static i
7100: 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  nt.CiphersObjCmd
7110: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
7120: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
7130: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
7140: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
7150: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
7160: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
7170: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tr = NULL;.    S
7180: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
7190: 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c  LL;.    SSL *ssl
71a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41   = NULL;.    STA
71b0: 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52  CK_OF(SSL_CIPHER
71c0: 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20  ) *sk;.    char 
71d0: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20  buf[BUFSIZ];.   
71e0: 20 54 63 6c 5f 53 69 7a 65 20 69 6e 64 65 78 3b   Tcl_Size index;
71f0: 0a 20 20 20 20 69 6e 74 20 76 65 72 62 6f 73 65  .    int verbose
7200: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72   = 0, use_suppor
7210: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ted = 0;.    con
7220: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
7230: 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f 69 64  ethod;.    (void
7240: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
7250: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
7260: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28  ed");..    if ((
7270: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62  objc < 2) || (ob
7280: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f  jc > 4)) {..Tcl_
7290: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
72a0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70  erp, 1, objv, "p
72b0: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65  rotocol ?verbose
72c0: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b  ? ?supported?");
72d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
72e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
72f0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
7300: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
7310: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73  jv[1], protocols
7320: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c  , "protocol", 0,
7330: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f   &index) != TCL_
7340: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7350: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7360: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32     if ((objc > 2
7370: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
7380: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7390: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72  p, objv[2], &ver
73a0: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  bose) != TCL_OK)
73b0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
73c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
73d0: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26  if ((objc > 3) &
73e0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  & Tcl_GetBoolean
73f0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7400: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75  objv[3], &use_su
7410: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f  pported) != TCL_
7420: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7430: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7440: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
7450: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74  ror();..    swit
7460: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63  ch ((enum protoc
7470: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73  ol)index) {..cas
7480: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20  e TLS_SSL2:.#if 
7490: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
74a0: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
74b0: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
74c0: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
74d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
74e0: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41  SSL2)..    Tcl_A
74f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7500: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
7510: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
7520: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
7530: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
7540: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7550: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
7560: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c      method = SSL
7570: 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  v2_method(); bre
7580: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7590: 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64   TLS_SSL3:.#if d
75a0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
75b0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
75c0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  SL_NO_SSL3) || d
75d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
75e0: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09  O_SSL3_METHOD)..
75f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
7600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
7610: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
7620: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7630: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
7640: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
7650: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7660: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7670: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68  hod = SSLv3_meth
7680: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7690: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
76a0: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  S1:.#if defined(
76b0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
76c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
76d0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
76e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
76f0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
7700: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7710: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
7720: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7730: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7740: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
7750: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
7760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7770: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54  ..    method = T
7780: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62  LSv1_method(); b
7790: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
77a0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23  se TLS_TLS1_1:.#
77b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
77c0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
77d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
77e0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
77f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
7800: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
7810: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7820: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
7830: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
7840: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7850: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
7860: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
7870: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
7880: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
7890: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29  TLSv1_1_method()
78a0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
78b0: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32  .case TLS_TLS1_2
78c0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
78d0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
78e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
78f0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
7900: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7910: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  1_2_METHOD)..   
7920: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7930: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7940: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7950: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7960: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
7970: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7980: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7990: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
79a0: 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f   = TLSv1_2_metho
79b0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
79c0: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
79d0: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_3:.#if defined
79e0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
79f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7a00: 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20 20 54  O_TLS1_3)..    T
7a10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7a20: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7a30: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7a40: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7a50: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
7a60: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7a70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7a80: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7a90: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09   TLS_method();..
7aa0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7ab0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
7ac0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
7ad0: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c  RSION);..    SSL
7ae0: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
7af0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
7b00: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
7b10: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e  ..    break;.#en
7b20: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  dif..default:.. 
7b30: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f     method = TLS_
7b40: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62  method();..    b
7b50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7b60: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e   ctx = SSL_CTX_n
7b70: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20  ew(method);.    
7b80: 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29  if (ctx == NULL)
7b90: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
7ba0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54  sult(interp, GET
7bb0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
7bc0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
7bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7be0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c  ;.    }..    ssl
7bf0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b   = SSL_new(ctx);
7c00: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
7c10: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7c20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7c30: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7c40: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
7c50: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
7c60: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
7c70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7c80: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73  ..    /* Use lis
7c90: 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77  t and order as w
7ca0: 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20  ould be sent in 
7cb0: 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72  a ClientHello or
7cc0: 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63   all available c
7cd0: 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66  iphers */.    if
7ce0: 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   (use_supported)
7cf0: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
7d00: 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68  1_supported_ciph
7d10: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20  ers(ssl);.    } 
7d20: 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c  else {..sk = SSL
7d30: 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c  _get_ciphers(ssl
7d40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
7d50: 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a   (sk != NULL) {.
7d60: 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b  .if (!verbose) {
7d70: 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ..    const char
7d80: 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a 50 74   *cp;..    objPt
7d90: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
7da0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  bj(0, NULL);..  
7db0: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
7dc0: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50  ; i < sk_SSL_CIP
7dd0: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b  HER_num(sk); i++
7de0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f  ) {...const SSL_
7df0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53  CIPHER *c = sk_S
7e00: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28  SL_CIPHER_value(
7e10: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20  sk, i);...if (c 
7e20: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75  == NULL) continu
7e30: 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20  e;..../* cipher 
7e40: 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a  name or (NONE) *
7e50: 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50  /...cp = SSL_CIP
7e60: 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b  HER_get_name(c);
7e70: 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c  ...if (cp == NUL
7e80: 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f  L) break;...Tcl_
7e90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7ea0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
7eb0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
7ec0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 20 63  ngObj((char *) c
7ed0: 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  p, -1));..    }.
7ee0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
7ef0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7f00: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b  StringObj("",0);
7f10: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
7f20: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
7f30: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
7f40: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
7f50: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
7f60: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
7f70: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
7f80: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
7f90: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78  tinue;..../* tex
7fa0: 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  tual description
7fb0: 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a   of the cipher *
7fc0: 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48  /...if (SSL_CIPH
7fd0: 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
7fe0: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
7ff0: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f)) != NULL) {..
8000: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54  .    Tcl_AppendT
8010: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66  oObj(objPtr, buf
8020: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 72  , (Tcl_Size) str
8030: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65  len(buf));...} e
8040: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  lse {...    Tcl_
8050: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50  AppendToObj(objP
8060: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c  tr, "UNKNOWN\n",
8070: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a   8);...}..    }.
8080: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70  .}..if (use_supp
8090: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b  orted) {..    sk
80a0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65  _SSL_CIPHER_free
80b0: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  (sk);..}.    }. 
80c0: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29     SSL_free(ssl)
80d0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ;.    SSL_CTX_fr
80e0: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63  ee(ctx);..    Tc
80f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
8100: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
8110: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
8120: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8170: 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f   *. * ProtocolsO
8180: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76  bjCmd -- list av
8190: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  ailable protocol
81a0: 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  s. *. *.This pro
81b0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
81c0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
81d0: 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73   "tls::protocols
81e0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
81f0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70  list available p
8200: 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20  rotocols.. *. * 
8210: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
8220: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
8230: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
8240: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
8250: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
82a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74  .static int.Prot
82b0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65  ocolsObjCmd(Clie
82c0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
82d0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
82e0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
82f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
8300: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
8310: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20  l_Obj *objPtr;. 
8320: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
8330: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
8340: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
8350: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31     if (objc != 1
8360: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
8370: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
8380: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74   objv, "");..ret
8390: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
83a0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
83b0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
83c0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
83d0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
83e0: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  L);..#if OPENSSL
83f0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
8400: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
8410: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8420: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
8430: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
8440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8460: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8470: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8480: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32  otocols[TLS_SSL2
8490: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
84a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
84b0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
84c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
84d0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
84e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
84f0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
8500: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8510: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8520: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8530: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8540: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a  LS_SSL3], -1));.
8550: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8560: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
8570: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8580: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
8590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
85a0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
85b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
85c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
85d0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
85e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
85f0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c  ocols[TLS_TLS1],
8600: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8610: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8620: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
8630: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8640: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
8650: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8660: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  _1_METHOD).    T
8670: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8680: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8690: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
86a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
86b0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20  ls[TLS_TLS1_1], 
86c0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
86d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
86e0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
86f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8700: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
8710: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8720: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  2_METHOD).    Tc
8730: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8740: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8750: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8760: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
8770: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d  s[TLS_TLS1_2], -
8780: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8790: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
87a0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
87b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
87c0: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  3).    Tcl_ListO
87d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
87e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
87f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8800: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8810: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_3], -1));.#e
8820: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65  ndif..    Tcl_Se
8830: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
8840: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
8850: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8860: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
88b0: 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  * HandshakeObjCm
88c0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
88d0: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
88e0: 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65  to verify whethe
88f0: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  r the handshake 
8900: 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f  is complete. *.o
8910: 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73  r not.. *. * Res
8920: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
8930: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20  ard Tcl result. 
8940: 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b  1 means handshak
8950: 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65  e complete, 0 me
8960: 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a  ans pending.. *.
8970: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
8980: 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53  . *.May force SS
8990: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f  L negotiation to
89a0: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a   take place.. *.
89b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
89c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
8a00: 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62   int HandshakeOb
8a10: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
8a20: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
8a30: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8a40: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
8a50: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
8a60: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
8a70: 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20  el chan;        
8a80: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
8a90: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
8aa0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
8ab0: 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20  tatePtr;        
8ac0: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20  /* client state 
8ad0: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a  for ssl socket *
8ae0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
8af0: 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b   *errStr = NULL;
8b00: 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31  .    int ret = 1
8b10: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20  ;.    int err = 
8b20: 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  0;.    (void) cl
8b30: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
8b40: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
8b50: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
8b60: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
8b70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8b80: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
8b90: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
8ba0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8bb0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
8bc0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61  rror();..    cha
8bd0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
8be0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
8bf0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
8c00: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
8c10: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
8c20: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
8c30: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8c40: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8c50: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
8c60: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
8c70: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
8c80: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
8c90: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
8ca0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
8cb0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
8cc0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
8cd0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
8ce0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8cf0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
8d00: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
8d10: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
8d20: 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
8d30: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
8d40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
8d50: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
8d60: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
8d70: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8d80: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
8d90: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
8da0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
8db0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8dc0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
8dd0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
8de0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
8df0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72  (chan);..    dpr
8e00: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c  intf("Calling Tl
8e10: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
8e20: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c  ");.    ret = Tl
8e30: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
8e40: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c  (statePtr, &err,
8e50: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66   1);.    dprintf
8e60: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  ("Tls_WaitForCon
8e70: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25  nect returned: %
8e80: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69  i", ret);..    i
8e90: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28  f (ret < 0 && ((
8ea0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
8eb0: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29  & TLS_TCL_ASYNC)
8ec0: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41   && (err == EAGA
8ed0: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  IN))) {..dprintf
8ee0: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20  ("Async set and 
8ef0: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a  err = EAGAIN");.
8f00: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20  .ret = 0;.    } 
8f10: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30  else if (ret < 0
8f20: 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74  ) {..long result
8f30: 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74  ;..errStr = stat
8f40: 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f  ePtr->err;..Tcl_
8f50: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
8f60: 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  rp);..Tcl_SetErr
8f70: 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21  no(err);...if (!
8f80: 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53  errStr || (*errS
8f90: 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20  tr == 0)) {..   
8fa0: 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f   errStr = Tcl_Po
8fb0: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29  sixError(interp)
8fc0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e  ;..}...Tcl_Appen
8fd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8fe0: 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65  "handshake faile
8ff0: 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63  d: ", errStr, (c
9000: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69  har *) NULL);..i
9010: 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c  f ((result = SSL
9020: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75  _get_verify_resu
9030: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  lt(statePtr->ssl
9040: 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29  )) != X509_V_OK)
9050: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
9060: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9070: 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c 20 58   " due to \"", X
9080: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f  509_verify_cert_
9090: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73  error_string(res
90a0: 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63 68 61  ult), "\"", (cha
90b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09  r *) NULL);..}..
90c0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
90d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
90e0: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41  "HANDSHAKE", "FA
90f0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
9100: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28  NULL);..dprintf(
9110: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45  "Returning TCL_E
9120: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68  RROR with handsh
9130: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ake failed: %s",
9140: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72   errStr);..retur
9150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9160: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65   } else {..if (e
9170: 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20  rr != 0) {..    
9180: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20  dprintf("Got an 
9190: 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d  error with a com
91a0: 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65  pleted handshake
91b0: 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72  : err = %i", err
91c0: 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a  );..}..ret = 1;.
91d0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
91e0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43  tf("Returning TC
91f0: 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c  L_OK with data \
9200: 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20  "%i\"", ret);.  
9210: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
9220: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
9230: 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a  ewIntObj(ret));.
9240: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
9250: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
92a0: 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43   *. * ImportObjC
92b0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
92c0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
92d0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
92e0: 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61   the "ssl" comma
92f0: 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c  nd. *. *.The ssl
9300: 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20   command pushes 
9310: 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c  SSL over a (newl
9320: 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70  y connected) tcp
9330: 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65   socket. *. * Re
9340: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
9350: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
9360: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
9370: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
9380: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
9390: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
93a0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
93f0: 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74  tatic int.Import
9400: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
9410: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
9420: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9430: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
9440: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
9450: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
9460: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
9470: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
9480: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
9490: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
94a0: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20  Ptr;../* client 
94b0: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f  state for ssl so
94c0: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
94d0: 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c 4c  CTX *ctx..= NULL
94e0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73  ;.    Tcl_Obj *s
94f0: 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20  cript..= NULL;. 
9500: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73     Tcl_Obj *pass
9510: 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  word..= NULL;.  
9520: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09    Tcl_Obj *vcmd.
9530: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9540: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68  _DString upperCh
9550: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
9560: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  , upperChannelBl
9570: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61  ocking, upperCha
9580: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70  nnelEncoding, up
9590: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
95a0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a  r;.    int idx;.
95b0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
95c0: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09  ;.    int flags.
95d0: 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54  ..= TLS_TCL_INIT
95e0: 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72  ;.    int server
95f0: 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f  ...= 0;./* is co
9600: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e  nnection incomin
9610: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a  g or outgoing? *
9620: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66  /.    char *keyf
9630: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
9640: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09   char *certfile.
9650: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73  .= NULL;.    uns
9660: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 09  igned char *key.
9670: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9680: 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 3d  _Size key_len..=
9690: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   0;.    unsigned
96a0: 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e   char *cert..= N
96b0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  ULL;.    Tcl_Siz
96c0: 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 3b  e cert_len..= 0;
96d0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65  .    char *ciphe
96e0: 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rs..= NULL;.    
96f0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
9700: 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  es..= NULL;.    
9710: 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d 20  char *CAfile..= 
9720: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9730: 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b 0a  CApath..= NULL;.
9740: 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f 72      char *CAstor
9750: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  e..= NULL;.    c
9760: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d  har *DHparams..=
9770: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9780: 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b  *model...= NULL;
9790: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
97a0: 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f  rname..= NULL;./
97b0: 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53  * hostname for S
97c0: 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63  erver Name Indic
97d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61  ation */.    cha
97e0: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d  r *session_id..=
97f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
9800: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c  bj *alpn..= NULL
9810: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d  ;.    int ssl2 =
9820: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20   0, ssl3 = 0;.  
9830: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20    int tls1 = 1, 
9840: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31  tls1_1 = 1, tls1
9850: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d  _2 = 1, tls1_3 =
9860: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74   1;.    int prot
9870: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d  o = 0, level = -
9880: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66  1;.    int verif
9890: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d  y = 0, require =
98a0: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c   0, request = 1,
98b0: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
98c0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
98d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
98e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
98f0: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ");..#if defined
9900: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
9910: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
9920: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d  TLS1).    tls1 =
9930: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
9940: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
9950: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9960: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
9970: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a      tls1_1 = 0;.
9980: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9990: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
99a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
99b0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20  _NO_TLS1_2).    
99c0: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64  tls1_2 = 0;.#end
99d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
99e0: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
99f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
9a00: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31  TLS1_3).    tls1
9a10: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  _3 = 0;.#endif..
9a20: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
9a30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
9a40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
9a50: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20   objv, "channel 
9a60: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65  ?options?");..re
9a70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9a80: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
9a90: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
9aa0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
9ab0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
9ac0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
9ad0: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
9ae0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
9af0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
9b00: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
9b10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
9b20: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
9b30: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
9b40: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
9b50: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
9b60: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
9b70: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66  el(chan);..    f
9b80: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78  or (idx = 2; idx
9b90: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20   < objc; idx++) 
9ba0: 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54  {..char *opt = T
9bb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
9bc0: 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f  v[idx]);...if (o
9bd0: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20  pt[0] != '-').. 
9be0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f     break;...OPTO
9bf0: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e  BJ("-alpn", alpn
9c00: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64  );..OPTSTR("-cad
9c10: 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 4f  ir", CApath);..O
9c20: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c  PTSTR("-cafile",
9c30: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54   CAfile);..OPTST
9c40: 52 28 22 2d 63 61 73 74 6f 72 65 22 2c 20 43 41  R("-castore", CA
9c50: 73 74 6f 72 65 29 3b 0a 09 4f 50 54 42 59 54 45  store);..OPTBYTE
9c60: 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20  ("-cert", cert, 
9c70: 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53  cert_len);..OPTS
9c80: 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20  TR("-certfile", 
9c90: 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53  certfile);..OPTS
9ca0: 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69  TR("-cipher", ci
9cb0: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28  phers);..OPTSTR(
9cc0: 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68  "-ciphers", ciph
9cd0: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ers);..OPTSTR("-
9ce0: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63  ciphersuites", c
9cf0: 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f  iphersuites);..O
9d00: 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22  PTOBJ("-command"
9d10: 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53  , script);..OPTS
9d20: 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20  TR("-dhparams", 
9d30: 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42  DHparams);..OPTB
9d40: 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c  YTE("-key", key,
9d50: 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53   key_len);..OPTS
9d60: 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b  TR("-keyfile", k
9d70: 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  eyfile);..OPTSTR
9d80: 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c  ("-model", model
9d90: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73  );..OPTOBJ("-pas
9da0: 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64  sword", password
9db0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f  );..OPTBOOL("-po
9dc0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70  st_handshake", p
9dd0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a  ost_handshake);.
9de0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65  .OPTBOOL("-reque
9df0: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09  st", request);..
9e00: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72  OPTBOOL("-requir
9e10: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f  e", require);..O
9e20: 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79  PTINT("-security
9e30: 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b  _level", level);
9e40: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76  ..OPTBOOL("-serv
9e50: 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f  er", server);..O
9e60: 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61  PTSTR("-serverna
9e70: 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  me", servername)
9e80: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73  ;..OPTSTR("-sess
9e90: 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e  ion_id", session
9ea0: 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  _id);..OPTBOOL("
9eb0: 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09  -ssl2", ssl2);..
9ec0: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c  OPTBOOL("-ssl3",
9ed0: 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl3);..OPTBOOL
9ee0: 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b  ("-tls1", tls1);
9ef0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9f00: 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f  .1", tls1_1);..O
9f10: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22  PTBOOL("-tls1.2"
9f20: 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42  , tls1_2);..OPTB
9f30: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74  OOL("-tls1.3", t
9f40: 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28  ls1_3);..OPTOBJ(
9f50: 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e  "-validatecomman
9f60: 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f  d", vcmd);..OPTO
9f70: 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64  BJ("-vcmd", vcmd
9f80: 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74  );...OPTBAD("opt
9f90: 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63  ion", "-alpn, -c
9fa0: 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d  adir, -cafile, -
9fb0: 63 61 73 74 6f 72 65 2c 20 2d 63 65 72 74 2c 20  castore, -cert, 
9fc0: 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68  -certfile, -ciph
9fd0: 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65  er, -ciphersuite
9fe0: 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68  s, -command, -dh
9ff0: 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b  params, -key, -k
a000: 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20  eyfile, -model, 
a010: 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74  -password, -post
a020: 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71  _handshake, -req
a030: 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20  uest, -require, 
a040: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c  -security_level,
a050: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65   -server, -serve
a060: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f  rname, -session_
a070: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33  id, -ssl2, -ssl3
a080: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31  , -tls1, -tls1.1
a090: 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31  , -tls1.2, -tls1
a0a0: 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65  .3, or -validate
a0b0: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74  command");...ret
a0c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a0d0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71     }.    if (req
a0e0: 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d  uest)..verify |=
a0f0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45   SSL_VERIFY_CLIE
a100: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45  NT_ONCE | SSL_VE
a110: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69  RIFY_PEER;.    i
a120: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65  f (request && re
a130: 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d  quire).verify |=
a140: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
a150: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
a160: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  ;.    if (reques
a170: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
a180: 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ake).verify |= S
a190: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
a1a0: 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66  ANDSHAKE;.    if
a1b0: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09   (verify == 0)..
a1c0: 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52  verify = SSL_VER
a1d0: 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70  IFY_NONE;..    p
a1e0: 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20  roto |= (ssl2 ? 
a1f0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a  TLS_PROTO_SSL2 :
a200: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
a210: 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52  = (ssl3 ? TLS_PR
a220: 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20  OTO_SSL3 : 0);. 
a230: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
a240: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  1 ? TLS_PROTO_TL
a250: 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  S1 : 0);.    pro
a260: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20  to |= (tls1_1 ? 
a270: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
a280: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a290: 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c   |= (tls1_2 ? TL
a2a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a  S_PROTO_TLS1_2 :
a2b0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
a2c0: 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f  = (tls1_3 ? TLS_
a2d0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30  PROTO_TLS1_3 : 0
a2e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74  );..    /* reset
a2f0: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e   to NULL if blan
a300: 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65  k string provide
a310: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72  d */.    if (cer
a320: 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20  t && !*cert)..  
a330: 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20        cert.     
a340: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a350: 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29  f (key && !*key)
a360: 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20  ..        key.  
a370: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
a380: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26    if (certfile &
a390: 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20  & !*certfile)   
a3a0: 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d        certfile.=
a3b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b   NULL;.    if (k
a3c0: 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66  eyfile && !*keyf
a3d0: 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20  ile)..keyfile.  
a3e0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
a3f0: 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26    if (ciphers &&
a400: 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20   !*ciphers).    
a410: 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20      ciphers.    
a420: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a430: 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73  if (ciphersuites
a440: 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74   && !*ciphersuit
a450: 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73  es) ciphersuites
a460: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a470: 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a  if (CAfile && !*
a480: 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20  CAfile).        
a490: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  CAfile.        =
a4a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43   NULL;.    if (C
a4b0: 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74  Apath && !*CApat
a4c0: 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74  h).        CApat
a4d0: 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  h.        = NULL
a4e0: 3b 0a 20 20 20 20 69 66 20 28 43 41 73 74 6f 72  ;.    if (CAstor
a4f0: 65 20 26 26 20 21 2a 43 41 73 74 6f 72 65 29 09  e && !*CAstore).
a500: 20 20 20 20 20 20 20 20 43 41 73 74 6f 72 65 09          CAstore.
a510: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a520: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
a530: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
a540: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
a550: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a560: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
a570: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
a580: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
a590: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
a5a0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
a5b0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
a5c0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
a5d0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
a5e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
a5f0: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
a600: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
a610: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
a620: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 09 3d 20  tatePtr->want.= 
a630: 30 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  0;.    statePtr-
a640: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79  >vflags.= verify
a650: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a660: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f  err.= "";..    /
a670: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70  * allocate scrip
a680: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72  t */.    if (scr
a690: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ipt) {..(void) T
a6a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a6b0: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e  Obj(script, &len
a6c0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a6d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61      statePtr->ca
a6e0: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b  llback = script;
a6f0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
a700: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
a710: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20  >callback);..}. 
a720: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
a730: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a  ocate password *
a740: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f  /.    if (passwo
a750: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  rd) {..(void) Tc
a760: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a770: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65  bj(password, &le
a780: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
a790: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
a7a0: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f  assword = passwo
a7b0: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  rd;..    Tcl_Inc
a7c0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a7d0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
a7e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a7f0: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74  allocate validat
a800: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  e command */.   
a810: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76   if (vcmd) {..(v
a820: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
a830: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20  ngFromObj(vcmd, 
a840: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a850: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a860: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09  ->vcmd = vcmd;..
a870: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a880: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
a890: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  cmd);..}.    }..
a8a0: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
a8b0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
a8c0: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
a8d0: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
a8e0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
a8f0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
a900: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b  , model, &mode);
a910: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54  ..if (chan == (T
a920: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
a930: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
a940: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
a950: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a960: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a970: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  RROR;..}.../*.. 
a980: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
a990: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
a9a0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20  pmost channel.. 
a9b0: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
a9c0: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
a9d0: 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74  n);..if (Tcl_Get
a9e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
a9f0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
aa00: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54  Type()) {..    T
aa10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
aa20: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
aa30: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
aa40: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
aa50: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
aa60: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
aa70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
aa80: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
aa90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
aaa0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43  S", "IMPORT", "C
aab0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
aac0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
aad0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
aae0: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
aaf0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
ab00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ab10: 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20  RROR;..}..ctx = 
ab20: 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65  ((State *)Tcl_Ge
ab30: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
ab40: 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78  Data(chan))->ctx
ab50: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
ab60: 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49  if ((ctx = CTX_I
ab70: 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65  nit(statePtr, se
ab80: 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79  rver, proto, key
ab90: 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20  file, certfile, 
aba0: 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c  key, cert, key_l
abb0: 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65  en,..    cert_le
abc0: 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 73 74 6f  n, CApath, CAsto
abd0: 72 65 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  re, CAfile, ciph
abe0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
abf0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
ac00: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ms)) == NULL) {.
ac10: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
ac20: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
ac30: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
ac40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ac50: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
ac60: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
ac70: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65  ctx;..    /* Pre
ac80: 73 65 72 76 65 20 63 68 61 6e 6e 65 6c 20 63 6f  serve channel co
ac90: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nfig */.    Tcl_
aca0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
acb0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
acc0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
acd0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
ace0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
acf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
ad00: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
ad10: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
ad20: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
ad30: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  t(&upperChannelE
ad40: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
ad50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
ad60: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
ad70: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70   "-eofchar", &up
ad80: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
ad90: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  r);.    Tcl_GetC
ada0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
adb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63  erp, chan, "-enc
adc0: 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68  oding", &upperCh
add0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
ade0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
adf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
ae00: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
ae10: 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61  tion", &upperCha
ae20: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
ae30: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
ae40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ae50: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
ae60: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
ae70: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20  nelBlocking);.. 
ae80: 20 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65     /* Ensure the
ae90: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69   channel works i
aea0: 6e 20 62 69 6e 61 72 79 20 6d 6f 64 65 20 28 66  n binary mode (f
aeb0: 6f 72 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f  or the encryptio
aec0: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f  n not to get goo
aed0: 66 65 64 20 75 70 29 2e 20 2a 2f 0a 20 20 20 20  fed up). */.    
aee0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
aef0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
af00: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
af10: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20  ", "binary");.  
af20: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
af30: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
af40: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  han, "-blocking"
af50: 2c 20 22 74 72 75 65 22 29 3b 0a 0a 20 20 20 20  , "true");..    
af60: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 63 6b 65  /* Create stacke
af70: 64 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  d channel */.   
af80: 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d   dprintf("Consum
af90: 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20  ing Tcl channel 
afa0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
afb0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a  nelName(chan));.
afc0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
afd0: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68  lf = Tcl_StackCh
afe0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c  annel(interp, Tl
aff0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c  s_ChannelType(),
b000: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
b010: 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45  atePtr,..(TCL_RE
b020: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49  ADABLE | TCL_WRI
b030: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20  TABLE), chan);. 
b040: 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61     dprintf("Crea
b050: 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  ted channel name
b060: 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  d %s", Tcl_GetCh
b070: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
b080: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20  tr->self));.    
b090: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65  if (statePtr->se
b0a0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
b0b0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a  el) NULL) {../*.
b0c0: 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63  . * No use of Tc
b0d0: 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  l_EventuallyFree
b0e0: 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73   because no poss
b0f0: 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76  ible Tcl_Preserv
b100: 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65  e... */..Tls_Fre
b110: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
b120: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b130: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b140: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
b150: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 63 6c 5f  nslation);..Tcl_
b160: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b170: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
b180: 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  g);..Tcl_DString
b190: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b1a0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 54 63 6c  elEOFChar);..Tcl
b1b0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b1c0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
b1d0: 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ng);..return TCL
b1e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
b1f0: 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 63 68     /* Restore ch
b200: 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a  annel config */.
b210: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b220: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b230: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b240: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
b250: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
b260: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
b270: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20  ranslation));.  
b280: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b290: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b2a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b2b0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f  -encoding", Tcl_
b2c0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b2d0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b2e0: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ng));.    Tcl_Se
b2f0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b300: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b310: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72  >self, "-eofchar
b320: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
b330: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
b340: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20  lEOFChar));.    
b350: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
b360: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
b370: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62  tePtr->self, "-b
b380: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53  locking", Tcl_DS
b390: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
b3a0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
b3b0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ));.    Tcl_DStr
b3c0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b3d0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b3e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b3f0: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b400: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
b410: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
b420: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b430: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
b440: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b450: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
b460: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ing);..    /*.  
b470: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c     * SSL Initial
b480: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a  ization.     */.
b490: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73      statePtr->ss
b4a0: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74  l = SSL_new(stat
b4b0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
b4c0: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73  if (!statePtr->s
b4d0: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69  sl) {../* SSL li
b4e0: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09  brary error */..
b4f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b500: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e  (interp, "couldn
b510: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c  't construct ssl
b520: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54   session: ", GET
b530: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b540: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b550: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b560: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b570: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49  S", "IMPORT", "I
b580: 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  NIT", "FAILED", 
b590: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b5a0: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66  .Tls_Free((tls_f
b5b0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
b5c0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
b5d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b5e0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74  .    /* Set host
b5f0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
b600: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61      if (serverna
b610: 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74  me) {../* Sets t
b620: 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69  he server name i
b630: 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20  ndication (SNI) 
b640: 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65  in ClientHello e
b650: 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20  xtension */../* 
b660: 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f  Per RFC 6066, ho
b670: 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49  stname is a ASCI
b680: 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  I encoded string
b690: 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36  , though RFC 436
b6a0: 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f  6 says UTF-8. */
b6b0: 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74  ..if (!SSL_set_t
b6c0: 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28  lsext_host_name(
b6d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
b6e0: 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65  ervername) && re
b6f0: 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63  quire) {..    Tc
b700: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b710: 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20  nterp, "Set SNI 
b720: 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64  extension failed
b730: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b740: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b750: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b760: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b770: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b780: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41  ORT", "SNI", "FA
b790: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b7a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b7b0: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b7c0: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
b7d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b7e0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
b7f0: 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f   Set hostname fo
b800: 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61  r peer certifica
b810: 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69  te hostname veri
b820: 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65  fication in clie
b830: 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75  nts...   Don't u
b840: 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74  se SSL_set1_host
b850: 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69   since it has li
b860: 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69  mitations. */..i
b870: 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73  f (!SSL_add1_hos
b880: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  t(statePtr->ssl,
b890: 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a   servername)) {.
b8a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b8b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
b8c0: 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20  et DNS hostname 
b8d0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b8e0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b8f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b900: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b910: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b920: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53  , "IMPORT", "HOS
b930: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22  TNAME", "FAILED"
b940: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b950: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
b960: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
b970: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b980: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b990: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
b9a0: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73    /* Resume sess
b9b0: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66  ion id */.    if
b9c0: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20   (session_id && 
b9d0: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b9e0: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49  d) <= SSL_MAX_SI
b9f0: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a  D_CTX_LENGTH) {.
ba00: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73  ./* SSL_set_sess
ba10: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53  ion() */..if (!S
ba20: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f  SL_SESSION_set1_
ba30: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67  id_context(SSL_g
ba40: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65  et_session(state
ba50: 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f  Ptr->ssl),...(co
ba60: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
ba70: 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c  r *) session_id,
ba80: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
ba90: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
baa0: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  d))) {..    Tcl_
bab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bac0: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73  erp, "Resume ses
bad0: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20  sion failed: ", 
bae0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
baf0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bb00: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
bb10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
bb20: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
bb30: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49   "SESSION", "FAI
bb40: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
bb50: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
bb60: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
bb70: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  pe *) statePtr);
bb80: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
bba0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20  ..    /* Enable 
bbb0: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65  Application-Laye
bbc0: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  r Protocol Negot
bbd0: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73  iation. Examples
bbe0: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a   are: http/1.0,.
bbf0: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  .http/1.1, h2, h
bc00: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f  3, ftp, imap, po
bc10: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c  p3, xmpp-client,
bc20: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71   xmpp-server, mq
bc30: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f  tt, irc, etc. */
bc40: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b  .    if (alpn) {
bc50: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
bc60: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  CL list into a p
bc70: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
bc80: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
bc90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
bca0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
bcb0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
bcc0: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69  len = 0;..Tcl_Si
bcd0: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20  ze cnt, i;..int 
bce0: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  j;..Tcl_Obj **li
bcf0: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
bd00: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
bd10: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26  (interp, alpn, &
bd20: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54  cnt, &list) != T
bd30: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c  CL_OK) {..    Tl
bd40: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
bd50: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
bd60: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
bd70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
bd80: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
bd90: 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
bda0: 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f   for the protoco
bdb0: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28  l-list */..for (
bdc0: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20  i = 0; i < cnt; 
bdd0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  i++) {..    Tcl_
bde0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
bdf0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
be00: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20  ..    if (len > 
be10: 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  255) {...Tcl_App
be20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
be30: 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  , "ALPN protocol
be40: 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22   names too long"
be50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
be60: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  ;...Tcl_SetError
be70: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
be80: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41  S", "IMPORT", "A
be90: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  LPN", "FAILED", 
bea0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
beb0: 09 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f  ..Tls_Free((tls_
bec0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
bed0: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e  tePtr);...return
bee0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
bef0: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c   }..    protos_l
bf00: 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20  en += 1 + (int) 
bf10: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69  len;..}.../* Bui
bf20: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ld the complete 
bf30: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
bf40: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c  ..protos = ckall
bf50: 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a  oc(protos_len);.
bf60: 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ./* protocol-lis
bf70: 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d  ts consist of 8-
bf80: 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69  bit length-prefi
bf90: 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67  xed, byte string
bfa0: 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30  s */..for (j = 0
bfb0: 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20  , p = protos; j 
bfc0: 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20  < cnt; j++) {.. 
bfd0: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54     char *str = T
bfe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
bff0: 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65  Obj(list[j], &le
c000: 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20  n);..    *p++ = 
c010: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20  (unsigned char) 
c020: 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79  len;..    memcpy
c030: 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74  (p, str, (size_t
c040: 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b  ) len);..    p +
c050: 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  = len;..}.../* S
c060: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74  SL_set_alpn_prot
c070: 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20  os makes a copy 
c080: 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d  of the protocol-
c090: 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65  list */../* Note
c0a0: 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
c0b0: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74  reverses the ret
c0c0: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e  urn value conven
c0d0: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c  tion */..if (SSL
c0e0: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
c0f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c100: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c  protos, protos_l
c110: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  en)) {..    Tcl_
c120: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c130: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70  erp, "Set ALPN p
c140: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a  rotocols failed:
c150: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
c160: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
c170: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
c180: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
c190: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
c1a0: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
c1b0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
c1c0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
c1d0: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
c1e0: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
c1f0: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72  ;..    ckfree(pr
c200: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75  otos);..    retu
c210: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
c220: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74  .../* Store prot
c230: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73  ocols list */..s
c240: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c250: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65  = protos;..state
c260: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c270: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  = protos_len;.  
c280: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
c290: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
c2a0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ULL;..statePtr->
c2b0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
c2c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
c2d0: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
c2e0: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  ks.     */.    S
c2f0: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_set_app_data(
c300: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c310: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c320: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20  ;./* point back 
c330: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c  to us */.    SSL
c340: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
c350: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
c360: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
c370: 6b 29 3b 0a 20 20 20 20 2f 2a 53 53 4c 5f 73 65  k);.    /*SSL_se
c380: 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 53  t_verify_depth(S
c390: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_set_verify_de
c3a0: 70 74 68 2c 20 30 29 3b 2a 2f 0a 20 20 20 20 53  pth, 0);*/.    S
c3b0: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  SL_set_info_call
c3c0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
c3d0: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  sl, InfoCallback
c3e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62  );..    /* Callb
c3f0: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e  ack for observin
c400: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  g protocol messa
c410: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ges */.#ifndef O
c420: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52  PENSSL_NO_SSL_TR
c430: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20  ACE.    /* void 
c440: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
c450: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
c460: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
c470: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
c480: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f     void SSL_CTX_
c490: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c4a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c4b0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
c4c0: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  ; */.    SSL_set
c4d0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
c4e0: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  g(statePtr->ssl,
c4f0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c500: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  r);.    SSL_set_
c510: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
c520: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73  tePtr->ssl, Mess
c530: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65  ageCallback);.#e
c540: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ndif..    /* Cre
c550: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  ate Tcl_Channel 
c560: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  BIO Handler */. 
c570: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62     statePtr->p_b
c580: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  io.= BIO_new_tcl
c590: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e  (statePtr, BIO_N
c5a0: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61  OCLOSE);.    sta
c5b0: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f  tePtr->bio.= BIO
c5c0: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29  _new(BIO_f_ssl()
c5d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76  );..    if (serv
c5e0: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72  er) {../* Server
c5f0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53   callbacks */..S
c600: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
c610: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67  t_servername_arg
c620: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c630: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c640: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c650: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c660: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  e_callback(state
c670: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c  Ptr->ctx, SNICal
c680: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58  lback);..SSL_CTX
c690: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  _set_client_hell
c6a0: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  o_cb(statePtr->c
c6b0: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  tx, HelloCallbac
c6c0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c6d0: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65  Ptr);..if (state
c6e0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
c6f0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
c700: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c  CTX_set_alpn_sel
c710: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c720: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c730: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c740: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53  ePtr);.#ifdef US
c750: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74  E_NPN..    if (t
c760: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c770: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53  s1_3 == 0) {...S
c780: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f  SL_CTX_set_next_
c790: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65  protos_advertise
c7a0: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  d_cb(statePtr->c
c7b0: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c  tx, NPNCallback,
c7c0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c7d0: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69  r);..    }.#endi
c7e0: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65  f..}.../* Enable
c7f0: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20   server to send 
c800: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74  cert request aft
c810: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c  er handshake (TL
c820: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09  S 1.3 only) */..
c830: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61  /* A write opera
c840: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70  tion must take p
c850: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72  lace for the Cer
c860: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74  tificate Request
c870: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20   to be..   sent 
c880: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74  to the client, t
c890: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20  his can be done 
c8a0: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64  with SSL_do_hand
c8b0: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20  shake(). */..if 
c8c0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c8d0: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c  _handshake && tl
c8e0: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c  s1_3) {..    SSL
c8f0: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70  _verify_client_p
c900: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74  ost_handshake(st
c910: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
c920: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
c930: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
c940: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
c950: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
c960: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
c970: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c980: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
c990: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
c9a0: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
c9b0: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
c9c0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c9d0: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
c9e0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c9f0: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
ca00: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
ca10: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
ca20: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
ca30: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
ca40: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
ca50: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
ca60: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
ca70: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
ca80: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
ca90: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
caa0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
cab0: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
cac0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
cad0: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
cae0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
caf0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
cb00: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
cb10: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
cb20: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
cb30: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
cb40: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
cb50: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
cb60: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
cb70: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
cb80: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
cb90: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
cba0: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
cbb0: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
cbc0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
cbd0: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
cbe0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
cbf0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
cc00: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 42 49  }..    /* Set BI
cc10: 4f 20 66 6f 72 20 72 65 61 64 20 61 6e 64 20 77  O for read and w
cc20: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  rite operations 
cc30: 6f 6e 20 53 53 4c 20 6f 62 6a 65 63 74 20 2a 2f  on SSL object */
cc40: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f  .    SSL_set_bio
cc50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
cc60: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c  statePtr->p_bio,
cc70: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
cc80: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73  );.    BIO_set_s
cc90: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  sl(statePtr->bio
cca0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  , statePtr->ssl,
ccb0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20   BIO_NOCLOSE);. 
ccc0: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 5f 6d     BIO_set_ssl_m
ccd0: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ode(statePtr->bi
cce0: 6f 2c 20 28 6c 6f 6e 67 29 20 21 73 65 72 76 65  o, (long) !serve
ccf0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r);..    /*.    
cd00: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e   * End of SSL In
cd10: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64  it.     */.    d
cd20: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
cd30: 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  g %s", Tcl_GetCh
cd40: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
cd50: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20  tr->self));.    
cd60: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
cd70: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54  terp, (char *) T
cd80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
cd90: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
cda0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
cdb0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
cdc0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce10: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72  --. *. * Unimpor
ce20: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  tObjCmd --. *. *
ce30: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
ce40: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65  is invoked to re
ce50: 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74  move the topmost
ce60: 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e   channel filter.
ce70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
ce80: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
ce90: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
cea0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
ceb0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
cec0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
ced0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf20: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
cf30: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  nt.UnimportObjCm
cf40: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
cf50: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
cf60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
cf70: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
cf80: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
cf90: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
cfa0: 63 68 61 6e 2c 20 70 61 72 65 6e 74 3b 09 2f 2a  chan, parent;./*
cfb0: 20 54 68 65 20 73 74 61 63 6b 65 64 20 61 6e 64   The stacked and
cfc0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
cfd0: 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nels */.    Tcl_
cfe0: 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61  DString upperCha
cff0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c  nnelTranslation,
d000: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f   upperChannelBlo
d010: 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  cking, upperChan
d020: 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70  nelEncoding, upp
d030: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
d040: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20  ;.    int res = 
d050: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f 69  TCL_OK;.    (voi
d060: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
d070: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
d080: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
d090: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
d0a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d0b0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
d0c0: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
d0d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d0e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c     }..    /* Val
d0f0: 69 64 61 74 65 20 63 68 61 6e 6e 65 6c 20 6e 61  idate channel na
d100: 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  me */.    chan =
d110: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
d120: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
d130: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
d140: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
d150: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
d160: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
d170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
d190: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
d1a0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
d1b0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
d1c0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
d1d0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
d1e0: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63  .    parent = Tc
d1f0: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e  l_GetStackedChan
d200: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
d210: 2f 2a 20 56 65 72 69 66 79 20 69 73 20 61 20 73  /* Verify is a s
d220: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a  tacked channel *
d230: 2f 0a 20 20 20 20 69 66 20 28 70 61 72 65 6e 74  /.    if (parent
d240: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
d250: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d260: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
d270: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
d280: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
d290: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 73  ,..."\": not a s
d2a0: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22 2c  tacked channel",
d2b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d2c0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
d2d0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
d2e0: 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22  TLS", "UNIMPORT"
d2f0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
d300: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
d310: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d320: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d330: 0a 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20 61  ..    /* Flush a
d340: 6e 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  ny pending data 
d350: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4f  */.    if (Tcl_O
d360: 75 74 70 75 74 42 75 66 66 65 72 65 64 28 63 68  utputBuffered(ch
d370: 61 6e 29 20 3e 20 30 20 26 26 20 54 63 6c 5f 46  an) > 0 && Tcl_F
d380: 6c 75 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43  lush(chan) != TC
d390: 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
d3a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d3b0: 2c 20 22 63 61 6e 27 74 20 66 6c 75 73 68 20 63  , "can't flush c
d3c0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
d3d0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d3e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d3f0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 20 73  }..    /* Init s
d400: 74 6f 72 61 67 65 20 2a 2f 0a 20 20 20 20 54 63  torage */.    Tc
d410: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
d420: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
d430: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
d440: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
d450: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
d460: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
d470: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
d480: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
d490: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
d4a0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
d4b0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20 20  lEncoding);..   
d4c0: 20 2f 2a 20 50 72 65 73 65 72 76 65 20 63 75 72   /* Preserve cur
d4d0: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 63 6f 6e  rent channel con
d4e0: 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47  fig */.    Tcl_G
d4f0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d500: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
d510: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
d520: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
d530: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
d540: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d550: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f  rp, chan, "-enco
d560: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  ding", &upperCha
d570: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
d580: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
d590: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d5a0: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
d5b0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
d5c0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
d5d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
d5e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
d5f0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
d600: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
d610: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20 20 20 20  nslation);..    
d620: 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68 65 20 63  /* Unstack the c
d630: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66  hannel */.    if
d640: 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61   (Tcl_UnstackCha
d650: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
d660: 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  n) != TCL_OK) {.
d670: 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52  .res = TCL_ERROR
d680: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d690: 52 65 73 74 6f 72 65 20 63 68 61 6e 6e 65 6c 20  Restore channel 
d6a0: 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 54 63  config */.    Tc
d6b0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
d6c0: 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61 72 65 6e  on(interp, paren
d6d0: 74 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  t, "-encoding", 
d6e0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
d6f0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
d700: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
d710: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
d720: 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61 72 65 6e  on(interp, paren
d730: 74 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54  t, "-eofchar", T
d740: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
d750: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
d760: 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f  Char));.    Tcl_
d770: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
d780: 28 69 6e 74 65 72 70 2c 20 70 61 72 65 6e 74 2c  (interp, parent,
d790: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
d7a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
d7b0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
d7c0: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20  ranslation));.  
d7d0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
d7e0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70  Option(interp, p
d7f0: 61 72 65 6e 74 2c 20 22 2d 62 6c 6f 63 6b 69 6e  arent, "-blockin
d800: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
d810: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
d820: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20  elBlocking));.. 
d830: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a     /* Clean-up *
d840: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
d850: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
d860: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
d870: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d880: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d890: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
d8a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
d8b0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
d8c0: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
d8d0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
d8e0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
d8f0: 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  g);.    return r
d900: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  es;.}.../*. *---
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d950: 0a 20 2a 0a 20 2a 20 54 6c 73 4c 6f 61 64 43 6c  . *. * TlsLoadCl
d960: 69 65 6e 74 43 41 46 69 6c 65 46 72 6f 6d 4d 65  ientCAFileFromMe
d970: 6d 6f 72 79 20 2d 2d 20 4c 6f 61 64 20 63 65 72  mory -- Load cer
d980: 74 69 66 69 63 61 74 65 73 20 66 72 6f 6d 20 61  tificates from a
d990: 20 63 6c 69 65 6e 74 0a 20 2a 09 43 41 20 66 69   client. *.CA fi
d9a0: 6c 65 20 66 72 6f 6d 20 56 46 53 20 69 6e 74 6f  le from VFS into
d9b0: 20 6d 65 6d 6f 72 79 2e 0a 20 2a 0a 20 2a 20 52   memory.. *. * R
d9c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 75 6d 62 65  esults:. *.Numbe
d9d0: 72 20 6f 66 20 63 65 72 74 69 66 69 63 61 74 65  r of certificate
d9e0: 73 20 6c 6f 61 64 65 64 20 6f 72 20 30 20 66 6f  s loaded or 0 fo
d9f0: 72 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  r none.. *. * Si
da00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4c  de effects:. *.L
da10: 6f 61 64 73 20 43 41 20 63 65 72 74 69 66 69 63  oads CA certific
da20: 61 74 65 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ates. *. *------
da30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
da70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73  /.static int.Tls
da80: 4c 6f 61 64 43 6c 69 65 6e 74 43 41 46 69 6c 65  LoadClientCAFile
da90: 46 72 6f 6d 4d 65 6d 6f 72 79 28 54 63 6c 5f 49  FromMemory(Tcl_I
daa0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53  nterp *interp, S
dab0: 53 4c 5f 43 54 58 20 2a 63 74 78 2c 20 54 63 6c  SL_CTX *ctx, Tcl
dac0: 5f 4f 62 6a 20 2a 66 69 6c 65 29 20 7b 0a 20 20  _Obj *file) {.  
dad0: 20 20 42 49 4f 20 20 2a 62 69 6f 20 20 3d 20 4e    BIO  *bio  = N
dae0: 55 4c 4c 3b 0a 20 20 20 20 58 35 30 39 20 2a 63  ULL;.    X509 *c
daf0: 65 72 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ert = NULL;.    
db00: 58 35 30 39 5f 53 54 4f 52 45 20 2a 73 74 6f 72  X509_STORE *stor
db10: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  e = NULL;.    Tc
db20: 6c 5f 4f 62 6a 20 20 20 20 2a 62 75 66 20 3d 20  l_Obj    *buf = 
db30: 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20  NULL;.    const 
db40: 76 6f 69 64 20 2a 64 61 74 61 20 3d 20 4e 55 4c  void *data = NUL
db50: 4c 3b 0a 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  L;.    X509_NAME
db60: 20 20 2a 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a    *name = NULL;.
db70: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
db80: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
db90: 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  es = NULL;.    i
dba0: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  nt ret = 0;.    
dbb0: 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20 30  Tcl_Size len = 0
dbc0: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 66  ;..    /* Read f
dbd0: 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ile into memory 
dbe0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  */.    Tcl_Chann
dbf0: 65 6c 20 69 6e 20 3d 20 54 63 6c 5f 46 53 4f 70  el in = Tcl_FSOp
dc00: 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e  enFileChannel(in
dc10: 74 65 72 70 2c 20 66 69 6c 65 2c 20 22 72 22 2c  terp, file, "r",
dc20: 20 30 29 3b 0a 20 20 20 20 69 66 20 28 69 6e 20   0);.    if (in 
dc30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 67 6f 74 6f  == NULL) {..goto
dc40: 20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a   cleanup;.    }.
dc50: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
dc60: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
dc70: 20 69 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22   in, "-encoding"
dc80: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
dc90: 20 62 75 66 20 3d 20 54 63 6c 5f 4e 65 77 4f 62   buf = Tcl_NewOb
dca0: 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  j();.    Tcl_Inc
dcb0: 72 52 65 66 43 6f 75 6e 74 28 62 75 66 29 3b 0a  rRefCount(buf);.
dcc0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 52 65 61  .    if (Tcl_Rea
dcd0: 64 43 68 61 72 73 28 69 6e 2c 20 62 75 66 2c 20  dChars(in, buf, 
dce0: 2d 31 2c 20 30 29 20 3c 20 30 29 20 7b 0a 09 54  -1, 0) < 0) {..T
dcf0: 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c  cl_Close(interp,
dd00: 20 69 6e 29 3b 0a 09 67 6f 74 6f 20 63 6c 65 61   in);..goto clea
dd10: 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  nup;.    }.    T
dd20: 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c  cl_Close(interp,
dd30: 20 69 6e 29 3b 0a 0a 20 20 20 20 64 61 74 61 20   in);..    data 
dd40: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  = (const void *)
dd50: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
dd60: 79 46 72 6f 6d 4f 62 6a 28 62 75 66 2c 20 26 6c  yFromObj(buf, &l
dd70: 65 6e 29 3b 0a 20 20 20 20 62 69 6f 20 3d 20 42  en);.    bio = B
dd80: 49 4f 5f 6e 65 77 5f 6d 65 6d 5f 62 75 66 28 64  IO_new_mem_buf(d
dd90: 61 74 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ata, len);.    i
dda0: 66 20 28 62 69 6f 20 3d 3d 20 4e 55 4c 4c 29 20  f (bio == NULL) 
ddb0: 7b 0a 09 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b  {..goto cleanup;
ddc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
ddd0: 68 65 72 65 20 74 68 65 20 63 65 72 74 73 20 67  here the certs g
dde0: 6f 20 2a 2f 0a 20 20 20 20 73 74 6f 72 65 20 3d  o */.    store =
ddf0: 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 65 72   SSL_CTX_get_cer
de00: 74 5f 73 74 6f 72 65 28 63 74 78 29 3b 0a 20 20  t_store(ctx);.  
de10: 20 20 69 66 20 28 73 74 6f 72 65 20 3d 3d 20 4e    if (store == N
de20: 55 4c 4c 29 20 7b 0a 09 73 74 6f 72 65 20 3d 20  ULL) {..store = 
de30: 58 35 30 39 5f 53 54 4f 52 45 5f 6e 65 77 28 29  X509_STORE_new()
de40: 3b 0a 09 69 66 20 28 73 74 6f 72 65 20 3d 3d 20  ;..if (store == 
de50: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 67 6f 74  NULL) {..    got
de60: 6f 20 63 6c 65 61 6e 75 70 3b 0a 09 7d 0a 20 20  o cleanup;..}.  
de70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68 65 72    }..    /* Wher
de80: 65 20 74 68 65 20 43 41 20 6e 61 6d 65 73 20 67  e the CA names g
de90: 6f 20 2a 2f 0a 20 20 20 20 63 65 72 74 4e 61 6d  o */.    certNam
dea0: 65 73 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d  es = sk_X509_NAM
deb0: 45 5f 6e 65 77 5f 6e 75 6c 6c 28 29 3b 0a 20 20  E_new_null();.  
dec0: 20 20 69 66 20 28 21 63 65 72 74 4e 61 6d 65 73    if (!certNames
ded0: 29 20 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ) {.        goto
dee0: 20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a   cleanup;.    }.
def0: 0a 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  .    /* Attempt 
df00: 74 6f 20 6c 6f 61 64 20 61 6c 6c 20 63 65 72 74  to load all cert
df10: 73 20 66 72 6f 6d 20 74 68 65 20 50 45 4d 20 66  s from the PEM f
df20: 69 6c 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ile */.    while
df30: 20 28 28 63 65 72 74 20 3d 20 50 45 4d 5f 72 65   ((cert = PEM_re
df40: 61 64 5f 62 69 6f 5f 58 35 30 39 28 62 69 6f 2c  ad_bio_X509(bio,
df50: 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 29 29   NULL, 0, NULL))
df60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
df70: 20 20 20 20 69 66 20 28 58 35 30 39 5f 53 54 4f      if (X509_STO
df80: 52 45 5f 61 64 64 5f 63 65 72 74 28 73 74 6f 72  RE_add_cert(stor
df90: 65 2c 20 63 65 72 74 29 20 3d 3d 20 30 29 20 7b  e, cert) == 0) {
dfa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 58 35 30  .            X50
dfb0: 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 20 20  9_free(cert);.  
dfc0: 20 20 20 20 20 20 20 20 20 20 72 65 74 20 3d 20            ret = 
dfd0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  0;.            g
dfe0: 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 20 20 20  oto cleanup;.   
dff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
e000: 2a 20 43 6f 70 79 20 6e 61 6d 65 20 74 6f 20 73  * Copy name to s
e010: 74 61 63 6b 20 62 65 66 6f 72 65 20 63 65 72 74  tack before cert
e020: 69 66 69 63 61 74 65 20 67 65 74 73 20 66 72 65  ificate gets fre
e030: 65 64 20 2a 2f 0a 09 6e 61 6d 65 20 3d 20 58 35  ed */..name = X5
e040: 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_get_subject_n
e050: 61 6d 65 28 63 65 72 74 29 3b 0a 20 20 20 20 20  ame(cert);.     
e060: 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 20     if (name) {. 
e070: 20 20 20 20 20 20 20 20 20 20 20 58 35 30 39 5f             X509_
e080: 4e 41 4d 45 20 2a 6e 61 6d 65 5f 63 6f 70 79 20  NAME *name_copy 
e090: 3d 20 58 35 30 39 5f 4e 41 4d 45 5f 64 75 70 28  = X509_NAME_dup(
e0a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
e0b0: 20 20 20 69 66 20 28 21 6e 61 6d 65 5f 63 6f 70     if (!name_cop
e0c0: 79 20 7c 7c 20 21 73 6b 5f 58 35 30 39 5f 4e 41  y || !sk_X509_NA
e0d0: 4d 45 5f 70 75 73 68 28 63 65 72 74 4e 61 6d 65  ME_push(certName
e0e0: 73 2c 20 6e 61 6d 65 5f 63 6f 70 79 29 29 20 7b  s, name_copy)) {
e0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e100: 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29   X509_free(cert)
e110: 3b 0a 09 09 72 65 74 20 3d 20 30 3b 0a 20 20 20  ;...ret = 0;.   
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
e130: 6f 20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  o cleanup;.     
e140: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e150: 20 7d 0a 20 20 20 20 20 20 20 20 58 35 30 39 5f   }.        X509_
e160: 66 72 65 65 28 63 65 72 74 29 3b 0a 20 20 20 20  free(cert);.    
e170: 20 20 20 20 72 65 74 20 2b 2b 3b 0a 20 20 20 20      ret ++;.    
e180: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 6c 65 61  }..    /* At lea
e190: 73 74 20 6f 6e 65 20 63 65 72 74 20 77 61 73 20  st one cert was 
e1a0: 61 64 64 65 64 20 73 6f 20 72 65 74 61 69 6e 20  added so retain 
e1b0: 74 68 65 20 73 74 6f 72 65 20 61 6e 64 20 43 41  the store and CA
e1c0: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20   list */.    if 
e1d0: 28 72 65 74 29 20 7b 0a 09 69 66 20 28 53 53 4c  (ret) {..if (SSL
e1e0: 5f 43 54 58 5f 67 65 74 5f 63 65 72 74 5f 73 74  _CTX_get_cert_st
e1f0: 6f 72 65 28 63 74 78 29 20 3d 3d 20 4e 55 4c 4c  ore(ctx) == NULL
e200: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ) {..    SSL_CTX
e210: 5f 73 65 74 5f 63 65 72 74 5f 73 74 6f 72 65 28  _set_cert_store(
e220: 63 74 78 2c 20 73 74 6f 72 65 29 3b 0a 09 7d 0a  ctx, store);..}.
e230: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
e240: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
e250: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 20 20 20   certNames);.   
e260: 20 7d 0a 0a 20 20 63 6c 65 61 6e 75 70 3a 0a 0a   }..  cleanup:..
e270: 20 20 20 20 69 66 20 28 21 20 72 65 74 29 20 7b      if (! ret) {
e280: 0a 09 2f 2a 20 4e 65 77 20 73 74 6f 72 65 20 69  ../* New store i
e290: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 2a  s not required *
e2a0: 2f 0a 09 69 66 20 28 73 74 6f 72 65 20 21 3d 20  /..if (store != 
e2b0: 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 65 72 74  SSL_CTX_get_cert
e2c0: 5f 73 74 6f 72 65 28 63 74 78 29 29 20 7b 0a 09  _store(ctx)) {..
e2d0: 20 20 20 20 58 35 30 39 5f 53 54 4f 52 45 5f 66      X509_STORE_f
e2e0: 72 65 65 28 73 74 6f 72 65 29 3b 0a 09 7d 0a 09  ree(store);..}..
e2f0: 2f 2a 20 43 65 72 74 20 6e 61 6d 65 73 20 77 69  /* Cert names wi
e300: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 20 2a  ll not be used *
e310: 2f 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73  /..if (certNames
e320: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 58 35 30 39  ) {..    sk_X509
e330: 5f 4e 41 4d 45 5f 70 6f 70 5f 66 72 65 65 28 63  _NAME_pop_free(c
e340: 65 72 74 4e 61 6d 65 73 2c 20 58 35 30 39 5f 4e  ertNames, X509_N
e350: 41 4d 45 5f 66 72 65 65 29 3b 0a 09 7d 0a 20 20  AME_free);..}.  
e360: 20 20 7d 0a 0a 20 20 20 20 42 49 4f 5f 66 72 65    }..    BIO_fre
e370: 65 28 62 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20  e(bio);..    if 
e380: 28 62 75 66 29 0a 09 54 63 6c 5f 44 65 63 72 52  (buf)..Tcl_DecrR
e390: 65 66 43 6f 75 6e 74 28 62 75 66 29 3b 0a 0a 20  efCount(buf);.. 
e3a0: 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d     return ret;.}
e3b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
e3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
e400: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f  * CTX_Init -- co
e410: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54  nstruct a SSL_CT
e420: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a  X instance. *. *
e430: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76   Results:. *.A v
e440: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73  alid SSL_CTX ins
e450: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20  tance or NULL.. 
e460: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
e470: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
e480: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
e490: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
e4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
e4e0: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
e4f0: 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  .CTX_Init(State 
e500: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
e510: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
e520: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c  to, char *keyfil
e530: 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c  e, char *certfil
e540: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
e550: 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67  char *key, unsig
e560: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20  ned char *cert, 
e570: 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e  Tcl_Size key_len
e580: 2c 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f  , Tcl_Size cert_
e590: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74  len, char *CApat
e5a0: 68 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73  h,.    char *CAs
e5b0: 74 6f 72 65 2c 20 63 68 61 72 20 2a 43 41 66 69  tore, char *CAfi
e5c0: 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72  le, char *cipher
e5d0: 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  s, char *ciphers
e5e0: 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c  uites, int level
e5f0: 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73  , char *DHparams
e600: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ) {.    Tcl_Inte
e610: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61  rp *interp = sta
e620: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
e630: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
e640: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
e650: 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20  DString ds;.    
e660: 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f  int off = 0, abo
e670: 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  rt = 0;.    int 
e680: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
e690: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
e6a0: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a  METHOD *method;.
e6b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
e6c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
e6d0: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f  (!proto) {..Tcl_
e6e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e6f0: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70  erp, "no valid p
e700: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
e710: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e720: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e730: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63  .    }..    /* c
e740: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78  reate SSL contex
e750: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  t */.#if OPENSSL
e760: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e770: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c  >= 0x10100000L |
e780: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  | defined(NO_SSL
e790: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
e7a0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
e7b0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
e7c0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
e7d0: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  SSL2)) {..Tcl_Ap
e7e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e7f0: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f  p, "SSL2 protoco
e800: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
e810: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e820: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
e830: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
e840: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
e850: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
e860: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
e870: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
e880: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
e890: 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL3)) {..Tcl_App
e8a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e8b0: 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c  , "SSL3 protocol
e8c0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
e8d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e8e0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e8f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
e900: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
e910: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
e920: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
e930: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
e940: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
e950: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  S1)) {..Tcl_Appe
e960: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e970: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63   "TLS 1.0 protoc
e980: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
e990: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e9a0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e9b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
e9c0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
e9d0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
e9e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e9f0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
ea00: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
ea10: 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09  OTO_TLS1_1)) {..
ea20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ea30: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
ea40: 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  1 protocol not s
ea50: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
ea60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
ea70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
ea80: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
ea90: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
eaa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
eab0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69  NO_TLS1_2).    i
eac0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
ead0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
eae0: 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _2)) {..Tcl_Appe
eaf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
eb00: 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63   "TLS 1.2 protoc
eb10: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
eb20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
eb30: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
eb40: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
eb50: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
eb60: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
eb70: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
eb80: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
eb90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
eba0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09  OTO_TLS1_3)) {..
ebb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ebc0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
ebd0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
ebe0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
ebf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
ec00: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
ec10: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72  endif.    if (pr
ec20: 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20  oto == 0) {../* 
ec30: 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a  Use full range *
ec40: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  /..SSL_CTX_set_m
ec50: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
ec60: 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43  (ctx, 0);..SSL_C
ec70: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
ec80: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29  _version(ctx, 0)
ec90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
eca0: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69  tch (proto) {.#i
ecb0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
ecc0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
ecd0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
ece0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
ecf0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
ed00: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
ed10: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
ed20: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
ed30: 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72  rver ? SSLv2_ser
ed40: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
ed50: 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv2_client_meth
ed60: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
ed70: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
ed80: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
ed90: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
eda0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
edb0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
edc0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
edd0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
ede0: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  SL3:..method = i
edf0: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f  sServer ? SSLv3_
ee00: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
ee10: 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d  : SSLv3_client_m
ee20: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
ee30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
ee40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
ee50: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
ee60: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  L_NO_TLS1) && !d
ee70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
ee80: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20  O_TLS1_METHOD). 
ee90: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
eea0: 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20  O_TLS1:..method 
eeb0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
eec0: 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v1_server_method
eed0: 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e  () : TLSv1_clien
eee0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
eef0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
ef00: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
ef10: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
ef20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
ef30: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
ef40: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
ef50: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
ef60: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
ef70: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  1:..method = isS
ef80: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f  erver ? TLSv1_1_
ef90: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
efa0: 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74  : TLSv1_1_client
efb0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
efc0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
efd0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
efe0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
eff0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
f000: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
f010: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
f020: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
f030: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
f040: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
f050: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73  rver ? TLSv1_2_s
f060: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
f070: 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f   TLSv1_2_client_
f080: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
f090: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
f0a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
f0b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
f0c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
f0d0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
f0e0: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55  TO_TLS1_3:../* U
f0f0: 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d  se the generic m
f100: 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72  ethod and constr
f110: 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72  aint range after
f120: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61   context is crea
f130: 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d  ted */..method =
f140: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f   isServer ? TLS_
f150: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
f160: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74  : TLS_client_met
f170: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
f180: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
f190: 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65  t:../* Negotiate
f1a0: 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62   highest availab
f1b0: 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69  le SSL/TLS versi
f1c0: 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  on */..method = 
f1d0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
f1e0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
f1f0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
f200: 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  od();.#if OPENSS
f210: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
f220: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
f230: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
f240: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
f250: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
f260: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
f270: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
f280: 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a  TO_SSL2)   ? 0 :
f290: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32   SSL_OP_NO_SSLv2
f2a0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
f2b0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
f2c0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
f2d0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66  SSL_NO_SSL3)..of
f2e0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
f2f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
f300: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  SL3)   ? 0 : SSL
f310: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23  _OP_NO_SSLv3);.#
f320: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
f330: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
f340: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
f350: 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d  NO_TLS1)..off |=
f360: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
f370: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
f380: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
f390: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69  NO_TLSv1);.#endi
f3a0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
f3b0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
f3c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
f3d0: 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d  _TLS1_1)..off |=
f3e0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
f3f0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
f400: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  1) ? 0 : SSL_OP_
f410: 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e  NO_TLSv1_1);.#en
f420: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
f430: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
f440: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
f450: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20  NO_TLS1_2)..off 
f460: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
f470: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
f480: 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_2) ? 0 : SSL_O
f490: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23  P_NO_TLSv1_2);.#
f4a0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
f4b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
f4c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
f4d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66  L_NO_TLS1_3)..of
f4e0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
f4f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
f500: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_3) ? 0 : SSL
f510: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b  _OP_NO_TLSv1_3);
f520: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a  .#endif..break;.
f530: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
f540: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
f550: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
f560: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
f570: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72    if (!ctx) {..r
f580: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
f590: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e  }..    if (geten
f5a0: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
f5b0: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
f5c0: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b  _keylog_callback
f5d0: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c  (ctx, KeyLogCall
f5e0: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  back);.    }..#i
f5f0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
f600: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
f610: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
f620: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f  1_3).    if (pro
f630: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f  to == TLS_PROTO_
f640: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43  TLS1_3) {..SSL_C
f650: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
f660: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
f670: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
f680: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
f690: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
f6a0: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
f6b0: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  N);.    }.#endif
f6c0: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63  ..    /* Force c
f6d0: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20  ipher selection 
f6e0: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20  order by server 
f6f0: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65  */.    if (!isSe
f700: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58  rver) {..SSL_CTX
f710: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
f720: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f  , SSL_OP_CIPHER_
f730: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43  SERVER_PREFERENC
f740: 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f  E);.    }..#if O
f750: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
f760: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
f770: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f  00L.    OpenSSL_
f780: 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68  add_all_algorith
f790: 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69  ms(); /* Load ci
f7a0: 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74  phers and digest
f7b0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20  s */.#endif..   
f7c0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70   SSL_CTX_set_app
f7d0: 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  _data(ctx, (void
f7e0: 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65  *)interp);./* re
f7f0: 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72  member the inter
f800: 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53  preter */.    SS
f810: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
f820: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c  s(ctx, SSL_OP_AL
f830: 4c 29 3b 09 2f 2a 20 45 6e 61 62 6c 65 20 61 6c  L);./* Enable al
f840: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
f850: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
f860: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
f870: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  (ctx, SSL_OP_NO_
f880: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a  COMPRESSION);./*
f890: 20 44 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73   Disable compres
f8a0: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70  sion even if sup
f8b0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53  ported */.    SS
f8c0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
f8d0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a  s(ctx, off);../*
f8e0: 20 44 69 73 61 62 6c 65 20 73 70 65 63 69 66 69   Disable specifi
f8f0: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  ed protocol vers
f900: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ions */..    /* 
f910: 41 6c 6c 6f 77 20 77 72 69 74 65 73 20 74 6f 20  Allow writes to 
f920: 72 65 70 6f 72 74 20 73 75 63 63 65 73 73 20 77  report success w
f930: 68 65 6e 20 6c 65 73 73 20 74 68 61 6e 20 61 6c  hen less than al
f940: 6c 20 72 65 63 6f 72 64 73 20 68 61 76 65 20 62  l records have b
f950: 65 65 6e 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  een written */. 
f960: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
f970: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
f980: 45 5f 45 4e 41 42 4c 45 5f 50 41 52 54 49 41 4c  E_ENABLE_PARTIAL
f990: 5f 57 52 49 54 45 29 3b 0a 0a 20 20 20 20 2f 2a  _WRITE);..    /*
f9a0: 20 44 69 73 61 62 6c 65 20 61 74 74 65 6d 70 74   Disable attempt
f9b0: 73 20 74 6f 20 74 72 79 20 74 6f 20 70 72 6f 63  s to try to proc
f9c0: 65 73 73 20 74 68 65 20 6e 65 78 74 20 72 65 63  ess the next rec
f9d0: 6f 72 64 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ord instead of r
f9e0: 65 74 75 72 6e 69 6e 67 20 61 66 74 65 72 20 61  eturning after a
f9f0: 0a 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 20  .       non-app 
fa00: 72 65 63 6f 72 64 2e 20 41 76 6f 69 64 73 20 68  record. Avoids h
fa10: 61 6e 67 73 20 69 6e 20 62 6c 6f 63 6b 69 6e 67  angs in blocking
fa20: 20 6d 6f 64 65 2c 20 77 68 65 6e 20 75 73 69 6e   mode, when usin
fa30: 67 20 53 53 4c 5f 72 65 61 64 28 29 20 61 6e 64  g SSL_read() and
fa40: 20 61 0a 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70   a.       non-ap
fa50: 70 6c 69 63 61 74 69 6f 6e 20 72 65 63 6f 72 64  plication record
fa60: 20 77 61 73 20 73 65 6e 74 20 77 69 74 68 6f 75   was sent withou
fa70: 74 20 61 6e 79 20 61 70 70 6c 69 63 61 74 69 6f  t any applicatio
fa80: 6e 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 2f  n data. */.    /
fa90: 2a 53 53 4c 5f 43 54 58 5f 63 6c 65 61 72 5f 6d  *SSL_CTX_clear_m
faa0: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
fab0: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 2a 2f  E_AUTO_RETRY);*/
fac0: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
fad0: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a  ss_set_cache_siz
fae0: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20  e(ctx, 128);..  
faf0: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65    /* Set user de
fb00: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63  fined ciphers, c
fb10: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e  ipher suites, an
fb20: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  d security level
fb30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70   */.    if ((cip
fb40: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  hers != NULL) &&
fb50: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
fb60: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63  pher_list(ctx, c
fb70: 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f  iphers)) {..Tcl_
fb80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fb90: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
fba0: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
fbb0: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
fbc0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
fbd0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
fbe0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
fbf0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69     }.    if ((ci
fc00: 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55  phersuites != NU
fc10: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f  LL) && !SSL_CTX_
fc20: 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73  set_ciphersuites
fc30: 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74  (ctx, ciphersuit
fc40: 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  es)) {..Tcl_Appe
fc50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fc60: 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69   "Set cipher sui
fc70: 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76  tes failed: No v
fc80: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28  alid ciphers", (
fc90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
fca0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
fcb0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
fcc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
fcd0: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72  et automatic cur
fce0: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a  ve selection */.
fcf0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
fd00: 65 63 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31  ecdh_auto(ctx, 1
fd10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73  );..    /* Set s
fd20: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
fd30: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e  .    if (level >
fd40: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36   -1 && level < 6
fd50: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
fd60: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a  security_level *
fd70: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
fd80: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74  ecurity_level(ct
fd90: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  x, level);.    }
fda0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d  ..    /* set som
fdb0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
fdc0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
fdd0: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
fde0: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61  (ctx, PasswordCa
fdf0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
fe00: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
fe10: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64  _passwd_cb_userd
fe20: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a  ata(ctx, (void *
fe30: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  )statePtr);..   
fe40: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69   /* read a Diffi
fe50: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65  e-Hellman parame
fe60: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73  ters file, or us
fe70: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f  e the built-in o
fe80: 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  ne */.    Tcl_DS
fe90: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
fea0: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  #ifdef OPENSSL_N
feb0: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70  O_DH.    if (DHp
fec0: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
fed0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
fee0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70  lt(interp, "DH p
fef0: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74  arameter support
ff00: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c   not available",
ff10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ff20: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
ff30: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
ff40: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  L;.    }.#else. 
ff50: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69     {..DH* dh;..i
ff60: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
ff70: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20  ULL) {..    BIO 
ff80: 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20  *bio;...    bio 
ff90: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
ffa0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
ffb0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
ffc0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
ffd0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ffe0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
fff0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
10000 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20  uld not find DH 
10010 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22  parameters file"
10020 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
10030 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
10040 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
10050 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  NULL;..    }... 
10060 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64     dh = PEM_read
10070 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69  _bio_DHparams(bi
10080 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  o, NULL, NULL, N
10090 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66  ULL);..    BIO_f
100a0 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54  ree(bio);..    T
100b0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
100c0 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64  ds);..    if (!d
100d0 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  h) {...Tcl_Appen
100e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
100f0 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
10100 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
10110 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
10120 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
10130 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
10140 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
10150 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54     }..    SSL_CT
10160 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78  X_set_tmp_dh(ctx
10170 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66  , dh);..    DH_f
10180 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73  ree(dh);...} els
10190 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20  e {..    /* Use 
101a0 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61  well known DH pa
101b0 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 68 61  rameters that ha
101c0 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70  ve built-in supp
101d0 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a  ort in OpenSSL *
101e0 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  /..    if (!SSL_
101f0 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28  CTX_set_dh_auto(
10200 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c  ctx, 1)) {...Tcl
10210 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10220 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
10230 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61   enable set DH a
10240 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  uto: ", GET_ERR_
10250 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
10260 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
10270 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
10280 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
10290 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65     }..}.    }.#e
102a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74  ndif..    /* set
102b0 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65   our certificate
102c0 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69   */.    load_pri
102d0 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20  vate_key = 0;.  
102e0 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21    if (certfile !
102f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
10300 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
10310 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
10320 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
10330 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72  ile(ctx, F2N(cer
10340 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  tfile, &ds), SSL
10350 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
10360 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
10370 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
10380 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
10390 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
103a0 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63  "unable to set c
103b0 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
103c0 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
103d0 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
103e0 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
103f0 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
10400 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
10410 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
10420 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ..}..Tcl_DString
10430 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20  Free(&ds);..    
10440 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
10450 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
10460 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
10470 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
10480 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
10490 53 4e 31 28 63 74 78 2c 20 28 69 6e 74 29 20 63  SN1(ctx, (int) c
104a0 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c  ert_len, cert) <
104b0 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
104c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
104d0 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
104e0 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
104f0 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45   ",...GET_ERR_RE
10500 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
10510 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
10520 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
10530 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
10540 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
10550 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63  {..certfile = (c
10560 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65  har*)X509_get_de
10570 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28  fault_cert_file(
10580 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
10590 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
105a0 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66  _file(ctx, certf
105b0 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ile, SSL_FILETYP
105c0 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23  E_PEM) <= 0) {.#
105d0 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70  if 0..    Tcl_Ap
105e0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
105f0 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73  p, "unable to us
10600 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66  e default certif
10610 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
10620 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
10630 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
10640 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
10650 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
10660 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
10670 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64  eturn NULL;.#end
10680 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  if..}.    }..   
10690 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76   /* set our priv
106a0 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  ate key */.    i
106b0 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  f (load_private_
106c0 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66  key) {..if (keyf
106d0 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b  ile == NULL && k
106e0 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey == NULL) {.. 
106f0 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72     keyfile = cer
10700 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28  tfile;..}...if (
10710 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  keyfile != NULL)
10720 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74   {..    /* get t
10730 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61  he private key a
10740 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10750 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
10760 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66  */..    if (keyf
10770 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
10780 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66  .keyfile = certf
10790 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ile;..    }...  
107a0 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73    if (SSL_CTX_us
107b0 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c  e_PrivateKey_fil
107c0 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69  e(ctx, F2N(keyfi
107d0 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
107e0 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
107f0 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
10800 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a  gFree(&ds);.../*
10810 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
10820 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
10830 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
10840 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
10850 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
10860 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
10870 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
10880 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10890 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
108a0 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20  public key file 
108b0 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c  ", keyfile, " ",
108c0 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52  ...    GET_ERR_R
108d0 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
108e0 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
108f0 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
10900 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
10910 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
10920 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
10930 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20  .} else if (key 
10940 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
10950 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
10960 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28  PrivateKey_ASN1(
10970 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74  EVP_PKEY_RSA, ct
10980 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65  x, key, (int) ke
10990 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09  y_len) <= 0) {..
109a0 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
109b0 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
109c0 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
109d0 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
109e0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
109f0 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
10a00 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
10a10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10a20 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
10a30 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22  et public key: "
10a40 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
10a50 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
10a60 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
10a70 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
10a80 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
10a90 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f  }../* Now we kno
10aa0 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64  w that a key and
10ab0 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20   cert have been 
10ac0 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20  set against.. * 
10ad0 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  the SSL context 
10ae0 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58  */..if (!SSL_CTX
10af0 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b  _check_private_k
10b00 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20  ey(ctx)) {..    
10b10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10b20 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74  (interp, "privat
10b30 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  e key does not m
10b40 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69  atch the certifi
10b50 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22  cate public key"
10b60 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20  ,....     (char 
10b70 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
10b80 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
10b90 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
10ba0 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  LL;..}.    }..  
10bb0 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20    /* Set to use 
10bc0 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61  the default loca
10bd0 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f  tion and file fo
10be0 72 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75  r Certificate Au
10bf0 74 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 72  thority (CA) cer
10c00 74 69 66 69 63 61 74 65 73 2e 0a 20 20 20 20 20  tificates..     
10c10 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 43 41  * The default CA
10c20 20 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69   certificates di
10c30 72 65 63 74 6f 72 79 20 69 73 20 63 61 6c 6c 65  rectory is calle
10c40 64 20 63 65 72 74 73 20 69 6e 20 74 68 65 20 64  d certs in the d
10c50 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20  efault OpenSSL. 
10c60 20 20 20 20 2a 20 64 69 72 65 63 74 6f 72 79 2e      * directory.
10c70 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   It contains the
10c80 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73   CA certificates
10c90 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20   in PEM format, 
10ca0 77 69 74 68 20 6f 6e 65 20 63 65 72 74 69 66 69  with one certifi
10cb0 63 61 74 65 20 70 65 72 0a 20 20 20 20 20 2a 20  cate per.     * 
10cc0 66 69 6c 65 2e 20 54 68 65 20 76 65 72 69 66 79  file. The verify
10cd0 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20   path and store 
10ce0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
10cf0 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
10d00 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54  T_DIR env var. T
10d10 68 65 0a 20 20 20 20 20 2a 20 64 65 66 61 75 6c  he.     * defaul
10d20 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65  t CA certificate
10d30 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64  s file is called
10d40 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65   cert.pem in the
10d50 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c   default OpenSSL
10d60 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20   directory..    
10d70 20 2a 20 54 68 65 20 76 65 72 69 66 79 20 66 69   * The verify fi
10d80 6c 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  le can be overri
10d90 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f  dden by the SSL_
10da0 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61  CERT_FILE env va
10db0 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53  r. */.    if (!S
10dc0 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
10dd0 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28  lt_verify_paths(
10de0 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b  ctx)) {..abort++
10df0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10e00 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20 74 68  Overrides for th
10e10 65 20 43 41 20 76 65 72 69 66 79 20 70 61 74 68  e CA verify path
10e20 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20   and file */.   
10e30 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
10e40 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
10e50 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20  0x30000000L..if 
10e60 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20  (CApath != NULL 
10e70 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  || CAfile != NUL
10e80 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53  L) {..    Tcl_DS
10e90 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20  tring ds1;..    
10ea0 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
10eb0 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 69 66 20  &ds1);...    if 
10ec0 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76  (!SSL_CTX_load_v
10ed0 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28  erify_locations(
10ee0 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c  ctx, F2N(CAfile,
10ef0 20 26 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74   &ds), F2N(CApat
10f00 68 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61  h, &ds1))) {...a
10f10 62 6f 72 74 2b 2b 3b 0a 09 09 72 65 74 75 72 6e  bort++;...return
10f20 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
10f30 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
10f40 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
10f50 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
10f60 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65  s1);...    /* Se
10f70 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f  t list of CAs to
10f80 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20   send to client 
10f90 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
10fa0 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69  a client certifi
10fb0 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  cate */..    /* 
10fc0 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f  https://sourcefo
10fd0 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75  rge.net/p/tls/bu
10fe0 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f  gs/57/ */..    /
10ff0 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20  * XXX:TODO: Let 
11000 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20  the user supply 
11010 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74  values here inst
11020 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67  ead of something
11030 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20   that exists on 
11040 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a  the filesystem *
11050 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
11060 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
11070 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
11080 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
11090 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
110a0 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
110b0 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
110c0 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
110d0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
110e0 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
110f0 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
11100 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
11110 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 2f 2a 20 53  ..}..#else../* S
11120 65 74 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  et directory con
11130 74 61 69 6e 69 6e 67 20 43 41 20 63 65 72 74 69  taining CA certi
11140 66 69 63 61 74 65 73 20 69 6e 20 50 45 4d 20 66  ficates in PEM f
11150 6f 72 6d 61 74 2e 20 2a 2f 0a 09 69 66 20 28 43  ormat. */..if (C
11160 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b  Apath != NULL) {
11170 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
11180 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64  TX_load_verify_d
11190 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61  ir(ctx, F2N(CApa
111a0 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61  th, &ds))) {...a
111b0 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09  bort++;..    }..
111c0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
111d0 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f  ree(&ds);..}.../
111e0 2a 20 53 65 74 20 55 52 49 20 66 6f 72 20 74 6f  * Set URI for to
111f0 20 61 20 73 74 6f 72 65 2c 20 77 68 69 63 68 20   a store, which 
11200 6d 61 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  may be a single 
11210 63 6f 6e 74 61 69 6e 65 72 20 6f 72 20 61 20 63  container or a c
11220 61 74 61 6c 6f 67 20 6f 66 20 63 6f 6e 74 61 69  atalog of contai
11230 6e 65 72 73 2e 20 2a 2f 0a 09 69 66 20 28 43 41  ners. */..if (CA
11240 73 74 6f 72 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  store != NULL) {
11250 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
11260 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 73  TX_load_verify_s
11270 74 6f 72 65 28 63 74 78 2c 20 46 32 4e 28 43 41  tore(ctx, F2N(CA
11280 73 74 6f 72 65 2c 20 26 64 73 29 29 29 20 7b 0a  store, &ds))) {.
11290 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20  ..abort++;..    
112a0 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
112b0 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a  ngFree(&ds);..}.
112c0 0a 09 2f 2a 20 53 65 74 20 66 69 6c 65 20 6f 66  ../* Set file of
112d0 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73   CA certificates
112e0 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e 20   in PEM format. 
112f0 20 2a 2f 0a 09 69 66 20 28 43 41 66 69 6c 65 20   */..if (CAfile 
11300 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
11310 54 63 6c 5f 4f 62 6a 20 2a 63 61 66 69 6c 65 6f  Tcl_Obj *cafileo
11320 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  bj = Tcl_NewStri
11330 6e 67 4f 62 6a 28 43 41 66 69 6c 65 2c 20 2d 31  ngObj(CAfile, -1
11340 29 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  );..    Tcl_Incr
11350 52 65 66 43 6f 75 6e 74 28 63 61 66 69 6c 65 6f  RefCount(cafileo
11360 62 6a 29 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 4f  bj);...    Tcl_O
11370 62 6a 20 2a 66 73 69 6e 66 6f 20 3d 20 54 63 6c  bj *fsinfo = Tcl
11380 5f 46 53 46 69 6c 65 53 79 73 74 65 6d 49 6e 66  _FSFileSystemInf
11390 6f 28 63 61 66 69 6c 65 6f 62 6a 29 3b 0a 09 20  o(cafileobj);.. 
113a0 20 20 20 69 66 20 28 66 73 69 6e 66 6f 29 20 7b     if (fsinfo) {
113b0 0a 09 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  ...Tcl_IncrRefCo
113c0 75 6e 74 28 66 73 69 6e 66 6f 29 3b 0a 0a 09 09  unt(fsinfo);....
113d0 54 63 6c 5f 4f 62 6a 20 2a 66 73 74 79 70 65 20  Tcl_Obj *fstype 
113e0 3d 20 4e 55 4c 4c 3b 0a 09 09 54 63 6c 5f 4c 69  = NULL;...Tcl_Li
113f0 73 74 4f 62 6a 49 6e 64 65 78 28 69 6e 74 65 72  stObjIndex(inter
11400 70 2c 20 66 73 69 6e 66 6f 2c 20 30 2c 20 26 66  p, fsinfo, 0, &f
11410 73 74 79 70 65 29 3b 0a 0a 09 09 69 66 20 28 54  stype);....if (T
11420 63 6c 5f 53 74 72 69 6e 67 4d 61 74 63 68 28 22  cl_StringMatch("
11430 6e 61 74 69 76 65 22 2c 20 54 63 6c 5f 47 65 74  native", Tcl_Get
11440 53 74 72 69 6e 67 28 66 73 74 79 70 65 29 29 29  String(fstype)))
11450 20 7b 0a 09 09 20 20 20 20 69 66 20 28 21 53 53   {...    if (!SS
11460 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
11470 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
11480 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b  CAfile, &ds))) {
11490 0a 09 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 09 20  ....abort++;... 
114a0 20 20 20 7d 0a 09 09 20 20 20 20 54 63 6c 5f 44     }...    Tcl_D
114b0 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
114c0 0a 0a 09 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ....    /* Set l
114d0 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
114e0 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
114f0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
11500 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
11510 65 20 2a 2f 0a 09 09 20 20 20 20 53 54 41 43 4b  e */...    STACK
11520 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a  _OF(X509_NAME) *
11530 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f  certNames = SSL_
11540 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66  load_client_CA_f
11550 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20  ile(F2N(CAfile, 
11560 26 64 73 29 29 3b 0a 09 09 20 20 20 20 69 66 20  &ds));...    if 
11570 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55  (certNames != NU
11580 4c 4c 29 20 7b 0a 09 09 09 53 53 4c 5f 43 54 58  LL) {....SSL_CTX
11590 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _set_client_CA_l
115a0 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d  ist(ctx, certNam
115b0 65 73 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20  es);...    }... 
115c0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
115d0 65 65 28 26 64 73 29 3b 0a 0a 09 09 7d 20 65 6c  ee(&ds);....} el
115e0 73 65 20 7b 0a 09 09 20 20 20 20 2f 2a 20 4c 6f  se {...    /* Lo
115f0 61 64 20 63 65 72 74 69 66 69 63 61 74 65 20 69  ad certificate i
11600 6e 74 6f 20 6d 65 6d 6f 72 79 20 2a 2f 0a 09 09  nto memory */...
11610 20 20 20 20 69 66 20 28 21 54 6c 73 4c 6f 61 64      if (!TlsLoad
11620 43 6c 69 65 6e 74 43 41 46 69 6c 65 46 72 6f 6d  ClientCAFileFrom
11630 4d 65 6d 6f 72 79 28 69 6e 74 65 72 70 2c 20 63  Memory(interp, c
11640 74 78 2c 20 63 61 66 69 6c 65 6f 62 6a 29 29 20  tx, cafileobj)) 
11650 7b 0a 09 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 09  {....abort++;...
11660 20 20 20 20 7d 0a 09 09 7d 0a 09 09 54 63 6c 5f      }...}...Tcl_
11670 44 65 63 72 52 65 66 43 6f 75 6e 74 28 66 73 69  DecrRefCount(fsi
11680 6e 66 6f 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c  nfo);...    } el
11690 73 65 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 20  se {...abort++; 
116a0 2f 2a 20 50 61 74 68 20 69 73 20 6e 6f 74 20 72  /* Path is not r
116b0 65 63 6f 67 6e 69 7a 65 64 20 2a 2f 0a 09 20 20  ecognized */..  
116c0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 65 63    }..    Tcl_Dec
116d0 72 52 65 66 43 6f 75 6e 74 28 63 61 66 69 6c 65  rRefCount(cafile
116e0 6f 62 6a 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  obj);..}.#endif.
116f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61      }..    if (a
11700 62 6f 72 74 20 3e 20 30 29 20 7b 0a 09 2f 2a 20  bort > 0) {../* 
11710 72 65 74 75 72 6e 20 65 72 72 6f 72 20 2a 2f 0a  return error */.
11720 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11730 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   ctx;.}.../*. *-
11740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11780 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f  --. *. * StatusO
11790 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
117a0 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20  certificate for 
117b0 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 20 69  connected peer i
117c0 6e 66 6f 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  nfo.. *. * Resul
117d0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
117e0 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
117f0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
11800 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
11810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11850 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
11860 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
11870 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
11880 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
11890 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
118a0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
118b0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
118c0 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
118d0 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65  r;.    X509 *pee
118e0 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  r;.    Tcl_Obj *
118f0 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  objPtr;.    Tcl_
11900 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20  Channel chan;.  
11910 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e    char *channelN
11920 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20  ame, *ciphers;. 
11930 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
11940 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
11950 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
11960 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
11970 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20  n;.    int nid, 
11980 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  res;.    (void) 
11990 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
119a0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
119b0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
119c0 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20  c < 2 || objc > 
119d0 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20  3 || (objc == 3 
119e0 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47  && !strcmp(Tcl_G
119f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11a00 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b  ), "-local"))) {
11a10 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
11a20 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
11a30 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68  jv, "?-local? ch
11a40 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
11a50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11a60 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
11a70 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20  annel Id */.    
11a80 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63  channelName = Tc
11a90 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11aa0 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20  [(objc == 2 ? 1 
11ab0 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e  : 2)]);.    chan
11ac0 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
11ad0 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65  l(interp, channe
11ae0 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20  lName, &mode);. 
11af0 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
11b00 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
11b10 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
11b20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11b30 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11b40 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
11b50 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
11b60 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
11b70 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
11b80 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
11b90 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
11ba0 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
11bb0 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
11bc0 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
11bd0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
11be0 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
11bf0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
11c00 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
11c10 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
11c20 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
11c30 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
11c40 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
11c50 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43  S", "STATUS", "C
11c60 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
11c70 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
11c80 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
11c90 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11ca0 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
11cb0 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  te *) Tcl_GetCha
11cc0 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
11cd0 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  (chan);..    /* 
11ce0 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  Get certificate 
11cf0 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66  for peer or self
11d00 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
11d10 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d   == 2) {..peer =
11d20 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65   SSL_get_peer_ce
11d30 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
11d40 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20  tr->ssl);.    } 
11d50 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53  else {..peer = S
11d60 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61  SL_get_certifica
11d70 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
11d80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
11d90 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69  Get X509 certifi
11da0 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  cate info */.   
11db0 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62   if (peer) {..ob
11dc0 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35  jPtr = Tls_NewX5
11dd0 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65  09Obj(interp, pe
11de0 65 72 2c 20 31 29 3b 0a 09 69 66 20 28 6f 62 6a  er, 1);..if (obj
11df0 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58  c == 2) {..    X
11e00 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a  509_free(peer);.
11e10 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c  .    peer = NULL
11e20 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
11e30 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
11e40 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
11e50 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
11e60 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a  /* Peer name */.
11e70 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
11e80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11e90 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f  "peername", SSL_
11ea0 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74  get0_peername(st
11eb0 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
11ec0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  );.    LAPPEND_I
11ed0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
11ee0 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f  r, "sbits", SSL_
11ef0 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28  get_cipher_bits(
11f00 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e  statePtr->ssl, N
11f10 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68  ULL));..    ciph
11f20 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c  ers = (char*)SSL
11f30 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
11f40 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
11f50 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11f60 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
11f70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d  her", ciphers, -
11f80 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69  1);..    /* Veri
11f90 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74  fy the X509 cert
11fa0 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65  ificate presente
11fb0 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f  d by the peer */
11fc0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
11fd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11fe0 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c   "verifyResult",
11ff0 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  ..X509_verify_ce
12000 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
12010 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
12020 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
12030 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  ssl)), -1);..   
12040 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
12050 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53  */.    mode = SS
12060 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64  L_get_verify_mod
12070 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
12080 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26  ;.    if (mode &
12090 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45   SSL_VERIFY_NONE
120a0 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  ) {..LAPPEND_STR
120b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
120c0 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22   "verifyMode", "
120d0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
120e0 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62  } else {..Tcl_Ob
120f0 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20  j *listObjPtr = 
12100 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
12110 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f  , NULL);..if (mo
12120 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  de & SSL_VERIFY_
12130 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
12140 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12150 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
12160 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
12170 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
12180 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
12190 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49  (mode & SSL_VERI
121a0 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
121b0 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20  ER_CERT) {..    
121c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
121d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
121e0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
121f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66  _NewStringObj("f
12200 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63  ail if no peer c
12210 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ert", -1));..}..
12220 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56  if (mode & SSL_V
12230 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
12240 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
12250 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12260 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
12270 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
12280 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20  ringObj("client 
12290 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  once", -1));..}.
122a0 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f  .if (mode & SSL_
122b0 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
122c0 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63  SHAKE) {..    Tc
122d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
122e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
122f0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
12300 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73  ewStringObj("pos
12310 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31  t handshake", -1
12320 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  ));..}..LAPPEND_
12330 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OBJ(interp, objP
12340 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22  tr, "verifyMode"
12350 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20  , listObjPtr).  
12360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69    }..    /* Veri
12370 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f  fy mode depth */
12380 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
12390 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
123a0 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20   "verifyDepth", 
123b0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64  SSL_get_verify_d
123c0 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73  epth(statePtr->s
123d0 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  sl));..    /* Re
123e0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
123f0 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
12400 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65  result of the ne
12410 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  gotiation */.   
12420 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73   SSL_get0_alpn_s
12430 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
12440 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
12450 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
12460 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12470 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63  jPtr, "alpn", (c
12480 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63  har *)proto, (Tc
12490 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20  l_Size) len);.  
124a0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
124b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
124c0 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
124d0 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50  t_version(stateP
124e0 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  tr->ssl), -1);..
124f0 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72      /* Valid for
12500 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75   non-RSA signatu
12510 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a  re and TLS 1.3 *
12520 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
12530 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
12540 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
12550 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
12560 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
12570 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
12580 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
12590 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
125a0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
125b0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65     }.    if (!re
125c0 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20  s) {nid = 0;}.  
125d0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
125e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
125f0 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f  ignatureHashAlgo
12600 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32  rithm", OBJ_nid2
12610 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20  ln(nid), -1);.. 
12620 20 20 20 2f 2a 20 41 64 64 65 64 20 69 6e 20 4f     /* Added in O
12630 70 65 6e 53 53 4c 20 31 2e 31 2e 31 61 20 2a 2f  penSSL 1.1.1a */
12640 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
12650 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78  SION_NUMBER > 0x
12660 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 69 66  10101000L.    if
12670 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
12680 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
12690 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
126a0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
126b0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
126c0 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
126d0 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
126e0 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
126f0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
12700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
12710 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a  res) {nid = 0;}.
12720 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
12730 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12740 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c  "signatureType",
12750 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29   OBJ_nid2ln(nid)
12760 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  , -1);.#endif.. 
12770 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
12780 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
12790 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
127a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
127b0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
127c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127f0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65  ----. *. * Conne
12800 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20  ctionInfoObjCmd 
12810 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63  -- return connec
12820 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f  tion info from O
12830 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
12840 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74  sults:. *.A list
12850 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   of connection i
12860 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nfo.  *. *------
12870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
128b0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f  /..static int Co
128c0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
128d0 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
128e0 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
128f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
12900 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
12910 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
12920 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
12930 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
12940 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
12950 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53  mode on */.    S
12960 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09  tate *statePtr;.
12970 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65  ./* client state
12980 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
12990 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
129a0 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72  objPtr, *listPtr
129b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20  ;.    const SSL 
129c0 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20  *ssl;.    const 
129d0 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68  SSL_CIPHER *ciph
129e0 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  er;.    const SS
129f0 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69  L_SESSION *sessi
12a00 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56  on;.    const EV
12a10 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76  P_MD *md;.    (v
12a20 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
12a30 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
12a40 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
12a50 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
12a60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12a70 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
12a80 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
12a90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12aa0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
12ab0 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
12ac0 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
12ad0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
12ae0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
12af0 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
12b00 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
12b10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12b20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12b30 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
12b40 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
12b50 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
12b60 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
12b70 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
12b80 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
12b90 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
12ba0 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
12bb0 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
12bc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12bd0 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
12be0 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
12bf0 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
12c00 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
12c10 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
12c20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
12c30 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
12c40 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
12c50 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
12c60 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
12c70 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
12c80 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
12c90 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
12ca0 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
12cb0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
12cc0 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
12cd0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
12ce0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
12cf0 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
12d00 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
12d10 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
12d20 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
12d30 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
12d40 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
12d50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12d60 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
12d70 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20   int ulen;.../* 
12d80 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  Initialization f
12d90 69 6e 69 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50  inished */..LAPP
12da0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
12db0 20 6f 62 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66   objPtr, "init_f
12dc0 69 6e 69 73 68 65 64 22 2c 20 53 53 4c 5f 69 73  inished", SSL_is
12dd0 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73  _init_finished(s
12de0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 63 6f 6e 6e 65  sl));.../* conne
12df0 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09  ction state */..
12e00 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12e10 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
12e20 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73  te", SSL_state_s
12e30 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c  tring_long(ssl),
12e40 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53   -1);.../* Get S
12e50 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72  NI requested ser
12e60 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50  ver name */..LAP
12e70 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12e80 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72   objPtr, "server
12e90 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73  name", SSL_get_s
12ea0 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54  ervername(ssl, T
12eb0 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
12ec0 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a  ost_name), -1);.
12ed0 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
12ee0 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
12ef0 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
12f00 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e   the negotiation
12f10 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c   */..SSL_get0_al
12f20 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74  pn_selected(stat
12f30 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74  ePtr->ssl, &prot
12f40 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  o, &ulen);..LAPP
12f50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12f60 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
12f70 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28  (char *)proto, (
12f80 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
12f90 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63  .../* Get protoc
12fa0 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  ol */..LAPPEND_S
12fb0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12fc0 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53  r, "protocol", S
12fd0 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
12fe0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52  sl), -1);.../* R
12ff0 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c  enegotiation all
13000 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  owed */..LAPPEND
13010 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
13020 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61  jPtr, "renegotia
13030 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53  tion_allowed", S
13040 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65  SL_get_secure_re
13050 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70  negotiation_supp
13060 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29  ort((SSL *) ssl)
13070 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75  );.../* Get secu
13080 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c  rity level */..L
13090 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
130a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75  p, objPtr, "secu
130b0 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c  rity_level", SSL
130c0 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _get_security_le
130d0 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  vel(ssl));.../* 
130e0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  Session info */.
130f0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
13100 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
13110 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20  ession_reused", 
13120 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73  SSL_session_reus
13130 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49  ed(ssl));.../* I
13140 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  s server info */
13150 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
13160 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13170 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f  is_server", SSL_
13180 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b  is_server(ssl));
13190 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f  .../* Is DTLS */
131a0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
131b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
131c0 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73  is_dtls", SSL_is
131d0 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 69  _dtls(ssl));..#i
131e0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
131f0 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30  N_NUMBER >= 0x30
13200 32 30 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 51  200000L../* Is Q
13210 55 49 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  UIC */..LAPPEND_
13220 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
13230 50 74 72 2c 20 22 69 73 5f 71 75 69 63 22 2c 20  Ptr, "is_quic", 
13240 53 53 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c 29  SSL_is_quic(ssl)
13250 29 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 2a  );.../* Is TLS *
13260 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
13270 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13280 22 69 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 73  "is_tls", SSL_is
13290 5f 74 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e 64  _tls(ssl));.#end
132a0 69 66 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c 53  if.../* DANE TLS
132b0 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
132c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
132d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
132e0 20 22 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 53   "dane_auth", SS
132f0 4c 5f 67 65 74 30 5f 64 61 6e 65 28 28 53 53 4c  L_get0_dane((SSL
13300 20 2a 29 73 73 6c 29 20 21 3d 20 4e 55 4c 4c 29   *)ssl) != NULL)
13310 3b 0a 0a 09 2f 2a 20 57 61 69 74 69 6e 67 20 66  ;.../* Waiting f
13320 6f 72 20 61 73 79 6e 63 20 2a 2f 0a 09 4c 41 50  or async */..LAP
13330 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
13340 2c 20 6f 62 6a 50 74 72 2c 20 22 77 61 69 74 69  , objPtr, "waiti
13350 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 22 2c 20 53  ng_for_async", S
13360 53 4c 5f 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61  SL_waiting_for_a
13370 73 79 6e 63 28 28 53 53 4c 20 2a 29 73 73 6c 29  sync((SSL *)ssl)
13380 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d 6f 75 74  );.../* Time-out
13390 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
133a0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
133b0 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c 20 53 53  , "time-out", SS
133c0 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 74 69  L_get_default_ti
133d0 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a 0a 09 2f  meout(ssl));.../
133e0 2a 20 49 73 20 43 65 72 74 69 66 69 63 61 74 65  * Is Certificate
133f0 20 54 72 61 6e 73 70 61 72 65 6e 63 79 20 76 61   Transparency va
13400 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62 6c 65 64  lidation enabled
13410 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
13420 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
13430 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64 22 2c 20  , "ct_enabled", 
13440 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61 62 6c 65  SSL_ct_is_enable
13450 64 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a  d(ssl));.    }..
13460 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e      /* Cipher in
13470 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72  fo */.    cipher
13480 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
13490 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a  nt_cipher(ssl);.
134a0 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21      if (cipher !
134b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
134c0 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30  buf[BUFSIZ] = {0
134d0 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c  };..int bits, al
134e0 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70  g_bits;.../* Cip
134f0 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50  her name */..LAP
13500 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
13510 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
13520 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ", SSL_CIPHER_ge
13530 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  t_name(cipher), 
13540 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61  -1);.../* RFC na
13550 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
13560 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
13570 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
13580 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53  andard_name", SS
13590 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72  L_CIPHER_standar
135a0 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  d_name(cipher), 
135b0 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53  -1);.../* OpenSS
135c0 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72  L name of cipher
135d0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
135e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
135f0 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c   "openssl_name",
13600 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f   OPENSSL_cipher_
13610 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f  name(SSL_CIPHER_
13620 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69  standard_name(ci
13630 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f  pher)), -1);.../
13640 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72  * number of secr
13650 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72  et bits used for
13660 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73   cipher */..bits
13670 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
13680 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26  t_bits(cipher, &
13690 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50  alg_bits);..LAPP
136a0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
136b0 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f  objPtr, "secret_
136c0 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c  bits", bits);..L
136d0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
136e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f  p, objPtr, "algo
136f0 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67  rithm_bits", alg
13700 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f  _bits);../* alg_
13710 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b  bits is actual k
13720 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20  ey secret bits. 
13730 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20  If use bits and 
13740 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68  secret (algorith
13750 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a  m) bits differ,.
13760 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20  .   the rest of 
13770 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78  the bits are fix
13780 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d  ed, i.e. for lim
13790 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68  ited export ciph
137a0 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20  ers (bits < 56) 
137b0 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65  */.../* Indicate
137c0 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20  s which SSL/TLS 
137d0 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
137e0 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74   first defined t
137f0 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  he cipher */..LA
13800 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
13810 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76  , objPtr, "min_v
13820 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50  ersion", SSL_CIP
13830 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  HER_get_version(
13840 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
13850 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f  /* Cipher NID */
13860 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
13870 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
13880 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72  ipherNID", (char
13890 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
138a0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70  L_CIPHER_get_cip
138b0 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29  her_nid(cipher))
138c0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
138d0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
138e0 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c  tr, "digestNID",
138f0 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
13900 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
13910 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69  et_digest_nid(ci
13920 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
13930 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
13940 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78  , objPtr, "keyEx
13950 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61  changeNID", (cha
13960 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
13970 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78  SL_CIPHER_get_kx
13980 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
13990 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
139a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
139b0 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   "authentication
139c0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
139d0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
139e0 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64  HER_get_auth_nid
139f0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
13a00 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74  ../* message aut
13a10 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65  hentication code
13a20 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41   - Cipher is AEA
13a30 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43  D (e.g. GCM or C
13a40 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35  haCha20/Poly1305
13a50 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20  ) or not */../* 
13a60 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e  Authenticated En
13a70 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73  cryption with as
13a80 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41  sociated data (A
13a90 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c  EAD) check */..L
13aa0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
13ab0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
13ac0 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53  her_is_aead", SS
13ad0 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64  L_CIPHER_is_aead
13ae0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
13af0 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69  Digest used duri
13b00 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68  ng the SSL/TLS h
13b10 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73  andshake when us
13b20 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20  ing the cipher. 
13b30 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50  */..md = SSL_CIP
13b40 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b  HER_get_handshak
13b50 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29  e_digest(cipher)
13b60 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
13b70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13b80 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74  handshake_digest
13b90 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d  ", (char *)EVP_M
13ba0 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b  D_name(md), -1);
13bb0 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53  .../* Get OpenSS
13bc0 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e  L-specific ID, n
13bd0 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c  ot IANA ID */..L
13be0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
13bf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
13c00 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53  er_id", (int) SS
13c10 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28  L_CIPHER_get_id(
13c20 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54  cipher));.../* T
13c30 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20  wo-byte ID used 
13c40 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f  in the TLS proto
13c50 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e  col of the given
13c60 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
13c70 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
13c80 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f  objPtr, "protoco
13c90 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  l_id", (int) SSL
13ca0 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74  _CIPHER_get_prot
13cb0 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29  ocol_id(cipher))
13cc0 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64  ;.../* Textual d
13cd0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
13ce0 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20  e cipher */..if 
13cf0 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
13d00 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20  ription(cipher, 
13d10 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
13d20 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) != NULL) {..  
13d30 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
13d40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64  terp, objPtr, "d
13d50 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66  escription", buf
13d60 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  , -1);..}.    }.
13d70 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
13d80 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73  info */.    sess
13d90 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ion = SSL_get_se
13da0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20  ssion(ssl);.    
13db0 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e  if (session != N
13dc0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e  ULL) {..const un
13dd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
13de0 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  ket;..size_t len
13df0 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  2;..unsigned int
13e00 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e   ulen;..const un
13e10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
13e20 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b  sion_id, *proto;
13e30 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
13e40 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d  buffer[SSL_MAX_M
13e50 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48  ASTER_KEY_LENGTH
13e60 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  ];.../* Report t
13e70 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
13e80 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
13e90 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67   of the ALPN neg
13ea0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c  otiation */..SSL
13eb0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c  _SESSION_get0_al
13ec0 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73  pn_selected(sess
13ed0 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ion, &proto, &le
13ee0 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  n2);..LAPPEND_ST
13ef0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
13f00 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20  , "alpn", (char 
13f10 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53  *) proto, (Tcl_S
13f20 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
13f30 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
13f40 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
13f50 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
13f60 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e   NPN negotiation
13f70 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
13f80 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78  PN..SSL_get0_nex
13f90 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74  t_proto_negotiat
13fa0 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  ed(ssl, &proto, 
13fb0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
13fc0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
13fd0 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61  Ptr, "npn", (cha
13fe0 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c  r *) proto, (Tcl
13ff0 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65  _Size) ulen);.#e
14000 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61  ndif.../* Resuma
14010 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09  ble session */..
14020 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
14030 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65  erp, objPtr, "re
14040 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45  sumable", SSL_SE
14050 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62  SSION_is_resumab
14060 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  le(session));...
14070 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74  /* Session start
14080 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73   time (seconds s
14090 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09  ince epoch) */..
140a0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74  LAPPEND_LONG(int
140b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
140c0 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53  art_time", SSL_S
140d0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28  ESSION_get_time(
140e0 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
140f0 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20  Timeout value - 
14100 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65  SSL_CTX_get_time
14110 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  out (in seconds)
14120 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
14130 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
14140 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c  , "timeout", SSL
14150 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d  _SESSION_get_tim
14160 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a  eout(session));.
14170 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20  ../* Session id 
14180 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65  - TLSv1.2 and be
14190 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73  low only */..ses
141a0 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
141b0 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
141c0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
141d0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
141e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
141f0 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73  ession_id", sess
14200 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
14210 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
14220 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  ession context *
14230 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
14240 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
14250 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73  _id_context(sess
14260 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
14270 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
14280 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
14290 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20  ssion_context", 
142a0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
142b0 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09  _Size) ulen);...
142c0 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
142d0 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
142e0 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
142f0 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
14300 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
14310 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
14320 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
14330 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74  jPtr, "session_t
14340 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20  icket", ticket, 
14350 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
14360 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74  ;.../* Session t
14370 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68  icket lifetime h
14380 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  int (in seconds)
14390 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
143a0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
143b0 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53  , "lifetime", SS
143c0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
143d0 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
143e0 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  nt(session));...
143f0 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61  /* Ticket app da
14400 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ta */.#if OPENSS
14410 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
14420 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
14430 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
14440 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28  _ticket_appdata(
14450 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20  (SSL_SESSION *) 
14460 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
14470 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45  , &len2);..LAPPE
14480 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
14490 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65  , objPtr, "ticke
144a0 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63  t_app_data", tic
144b0 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ket, (Tcl_Size) 
144c0 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  len2);.#endif...
144d0 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65  /* Get master ke
144e0 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c  y */..len2 = SSL
144f0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73  _SESSION_get_mas
14500 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c  ter_key(session,
14510 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58   buffer, SSL_MAX
14520 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
14530 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  TH);..LAPPEND_BA
14540 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
14550 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79  Ptr, "master_key
14560 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f  ", buffer, (Tcl_
14570 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
14580 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64  * Compression id
14590 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e   */..unsigned in
145a0 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  t id = SSL_SESSI
145b0 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f  ON_get_compress_
145c0 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41  id(session);..LA
145d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
145e0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
145f0 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d  ession_id", id =
14600 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22  = 1 ? "zlib" : "
14610 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
14620 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  }..    /* Compre
14630 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
14640 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
14650 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45  L) {.#ifdef HAVE
14660 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  _SSL_COMPRESSION
14670 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54  ..const COMP_MET
14680 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e  HOD *comp, *expn
14690 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65  ;..comp = SSL_ge
146a0 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65  t_current_compre
146b0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70  ssion(ssl);..exp
146c0 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  n = SSL_get_curr
146d0 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73  ent_expansion(ss
146e0 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l);...LAPPEND_ST
146f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
14700 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  , "compression",
14710 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50   comp ? SSL_COMP
14720 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
14730 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09  : "none", -1);..
14740 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
14750 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70  rp, objPtr, "exp
14760 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20  ansion", expn ? 
14770 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
14780 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22  e(expn) : "none"
14790 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41  , -1);.#else..LA
147a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
147b0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
147c0 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c  ession", "none",
147d0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
147e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
147f0 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
14800 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e  "none", -1);.#en
14810 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
14820 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  * Server info */
14830 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64  .    {..long mod
14840 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f  e = SSL_CTX_get_
14850 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
14860 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
14870 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a  );..char *msg;..
14880 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f  .if (mode & SSL_
14890 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20  SESS_CACHE_OFF) 
148a0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66  {..    msg = "of
148b0 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  f";..} else if (
148c0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
148d0 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
148e0 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65  .    msg = "clie
148f0 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  nt";..} else if 
14900 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
14910 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b  _CACHE_SERVER) {
14920 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72  ..    msg = "ser
14930 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ver";..} else if
14940 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
14950 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a  S_CACHE_BOTH) {.
14960 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68  .    msg = "both
14970 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ";..} else {..  
14980 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e    msg = "unknown
14990 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53  ";..}..LAPPEND_S
149a0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
149b0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68  r, "session_cach
149c0 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31  e_mode", msg, -1
149d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
149e0 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20   CA List */.    
149f0 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76  /* IF not a serv
14a00 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  er, same as SSL_
14a10 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73  get0_peer_CA_lis
14a20 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d  t. If server sam
14a30 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74  e as SSL_CTX_get
14a40 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20  _client_CA_list 
14a50 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d  */.    listPtr =
14a60 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
14a70 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54  0, NULL);.    ST
14a80 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
14a90 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20  ) *ca_list;.    
14aa0 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53  if ((ca_list = S
14ab0 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  SL_get_client_CA
14ac0 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e  _list(ssl)) != N
14ad0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
14ae0 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f  fer[BUFSIZ];..fo
14af0 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
14b00 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e  < sk_X509_NAME_n
14b10 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b  um(ca_list); i++
14b20 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  ) {..    X509_NA
14b30 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35  ME *name = sk_X5
14b40 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61  09_NAME_value(ca
14b50 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20  _list, i);..    
14b60 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35  if (name) {...X5
14b70 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28  09_NAME_oneline(
14b80 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55  name, buffer, BU
14b90 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73  FSIZ);...Tcl_Lis
14ba0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14bb0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
14bc0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
14bd0 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29  Obj(buffer, -1))
14be0 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
14bf0 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  }.    LAPPEND_OB
14c00 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  J(interp, objPtr
14c10 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74  , "caList", list
14c20 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  Ptr);.    LAPPEN
14c30 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
14c40 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75  jPtr, "caListCou
14c50 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d  nt", sk_X509_NAM
14c60 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b  E_num(ca_list));
14c70 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
14c80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
14c90 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
14ca0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
14cb0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65  -------. *. * Ve
14d00 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72  rsionObjCmd -- r
14d10 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74  eturn version st
14d20 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53  ring from OpenSS
14d30 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
14d40 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
14d50 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
14d60 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14d70 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
14d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dc0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
14dd0 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43  .VersionObjCmd(C
14de0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
14df0 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
14e00 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
14e10 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
14e20 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
14e30 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
14e40 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
14e50 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f  entData;.    (vo
14e60 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76  id) objc;.    (v
14e70 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20  oid) objv;..    
14e80 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
14e90 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d  );..    objPtr =
14ea0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14eb0 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  j(OPENSSL_VERSIO
14ec0 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20  N_TEXT, -1);.   
14ed0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
14ee0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
14ef0 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
14f00 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
14f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f50 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62  ---. *. * MiscOb
14f60 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d  jCmd -- misc com
14f70 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  mands. *. * Resu
14f80 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
14f90 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
14fa0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
14fb0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
14fc0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15000 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
15010 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43  int.MiscObjCmd(C
15020 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
15030 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
15040 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
15050 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
15060 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
15070 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
15080 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20  ar *commands [] 
15090 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72  = { "req", "strr
150a0 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
150b0 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
150c0 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c  C_REQ, C_STRREQ,
150d0 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
150e0 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20  Tcl_Size cmd;.  
150f0 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20    int isStr;.   
15100 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33   char buffer[163
15110 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  84];.    (void) 
15120 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
15130 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
15140 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
15150 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
15160 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15170 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62  p, 1, objv, "sub
15180 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29  command ?args?")
15190 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
151a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
151b0 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
151c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
151d0 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73  bjv[1], commands
151e0 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20  , "command", 0, 
151f0 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  &cmd) != TCL_OK)
15200 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
15210 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
15220 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
15230 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d  ();..    isStr =
15240 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45   (cmd == C_STRRE
15250 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  Q);.    switch (
15260 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63  (enum command) c
15270 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45  md) {..case C_RE
15280 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45  Q:..case C_STRRE
15290 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b  Q: {..    EVP_PK
152a0 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09  EY *pkey=NULL;..
152b0 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e      X509 *cert=N
152c0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e  ULL;..    X509_N
152d0 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a  AME *name=NULL;.
152e0 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c  .    Tcl_Obj **l
152f0 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53  istv;..    Tcl_S
15300 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20  ize listc;..    
15310 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f  int i;...    BIO
15320 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20   *out=NULL;...  
15330 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a    char *k_C="",*
15340 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c  k_ST="",*k_L="",
15350 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22  *k_O="",*k_OU=""
15360 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61  ,*k_CN="",*k_Ema
15370 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72  il="";..    char
15380 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74   *keyout,*pemout
15390 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20  ,*str;..    int 
153a0 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30  keysize,serial=0
153b0 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20  ,days=365;..#if 
153c0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
153d0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
153e0 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d  000L..    BIGNUM
153f0 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20   *bne = NULL;.. 
15400 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55     RSA *rsa = NU
15410 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45  LL;.#else..    E
15420 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78  VP_PKEY_CTX *ctx
15430 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
15440 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c  ..    if ((objc<
15450 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20  5) || (objc>6)) 
15460 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  {...Tcl_WrongNum
15470 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
15480 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b  objv, "keysize k
15490 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20  eyfile certfile 
154a0 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75  ?info?");...retu
154b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
154c0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54     }...    if (T
154d0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
154e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
154f0 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54  , &keysize) != T
15500 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72  CL_OK) {...retur
15510 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
15520 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d    }..    keyout=
15530 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15540 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d  jv[3]);..    pem
15550 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
15560 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20  g(objv[4]);..   
15570 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09   if (isStr) {...
15580 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
15590 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,keyout,"",0);.
155a0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
155b0 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29  erp,pemout,"",0)
155c0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
155d0 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09  f (objc>=6) {...
155e0 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
155f0 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
15600 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73  p, objv[5], &lis
15610 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54  tc, &listv) != T
15620 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72  CL_OK) {...    r
15630 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15640 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73  ...}....if ((lis
15650 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09  tc%2) != 0) {...
15660 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
15670 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d  t(interp,"Inform
15680 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20  ation list must 
15690 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72  have even number
156a0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e   of arguments",N
156b0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
156c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
156d0 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c  }...for (i=0; i<
156e0 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09  listc; i+=2) {..
156f0 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74  .    str=Tcl_Get
15700 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29  String(listv[i])
15710 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ;...    if (strc
15720 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d  mp(str,"days")==
15730 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
15740 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15750 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
15760 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a  &days)!=TCL_OK).
15770 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
15780 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
15790 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
157a0 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d  (str,"serial")==
157b0 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
157c0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
157d0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
157e0 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b  &serial)!=TCL_OK
157f0 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
15800 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
15810 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
15820 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20  mp(str,"C")==0) 
15830 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74  {....k_C=Tcl_Get
15840 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
15850 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
15860 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
15870 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "ST")==0) {....k
15880 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _ST=Tcl_GetStrin
15890 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
158a0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
158b0 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d  strcmp(str,"L")=
158c0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c  =0) {....k_L=Tcl
158d0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
158e0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
158f0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
15900 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09  str,"O")==0) {..
15910 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_O=Tcl_GetStr
15920 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
15930 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
15940 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55   (strcmp(str,"OU
15950 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55  ")==0) {....k_OU
15960 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
15970 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
15980 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
15990 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30  cmp(str,"CN")==0
159a0 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f  ) {....k_CN=Tcl_
159b0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
159c0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
159d0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
159e0 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20  tr,"Email")==0) 
159f0 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c  {....k_Email=Tcl
15a00 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
15a10 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
15a20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65  else {....Tcl_Se
15a30 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
15a40 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65  Unknown paramete
15a50 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74  r",NULL);....ret
15a60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
15a70 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
15a80 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
15a90 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
15aa0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
15ab0 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b   bne = BN_new();
15ac0 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f  ..    rsa = RSA_
15ad0 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79  new();..    pkey
15ae0 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28   = EVP_PKEY_new(
15af0 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20  );..    if (bne 
15b00 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d  == NULL || rsa =
15b10 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d  = NULL || pkey =
15b20 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65  = NULL || !BN_se
15b30 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46  t_word(bne,RSA_F
15b40 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e  4) ||...!RSA_gen
15b50 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61  erate_key_ex(rsa
15b60 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20  , keysize, bne, 
15b70 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b  NULL) || !EVP_PK
15b80 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b  EY_assign_RSA(pk
15b90 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56  ey, rsa)) {...EV
15ba0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
15bb0 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65  );.../* RSA_free
15bc0 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20  (rsa); freed by 
15bd0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f  EVP_PKEY_free */
15be0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
15bf0 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79  .#else..    pkey
15c00 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28   = EVP_RSA_gen((
15c10 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65  unsigned int) ke
15c20 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78  ysize);..    ctx
15c30 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f   = EVP_PKEY_CTX_
15c40 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a  new(pkey,NULL);.
15c50 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d  .    if (pkey ==
15c60 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20   NULL || ctx == 
15c70 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45  NULL || !EVP_PKE
15c80 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74  Y_keygen_init(ct
15c90 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45  x) ||...!EVP_PKE
15ca0 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65  Y_CTX_set_rsa_ke
15cb0 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b  ygen_bits(ctx, k
15cc0 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f  eysize) || !EVP_
15cd0 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c  PKEY_keygen(ctx,
15ce0 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50   &pkey)) {...EVP
15cf0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
15d00 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58  ;...EVP_PKEY_CTX
15d10 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64  _free(ctx);.#end
15d20 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  if...Tcl_SetResu
15d30 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
15d40 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76   generating priv
15d50 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a  ate key",NULL);.
15d60 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
15d70 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  OR;..    } else 
15d80 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  {...if (isStr) {
15d90 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
15da0 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
15db0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
15dc0 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
15dd0 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
15de0 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
15df0 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
15e00 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
15e10 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
15e20 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
15e30 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
15e40 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
15e50 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
15e60 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66  terp,keyout,buff
15e70 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
15e80 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
15e90 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
15ea0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
15eb0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
15ec0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
15ed0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
15ee0 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75  lename(out,keyou
15ef0 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
15f00 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
15f10 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
15f20 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
15f30 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d  L);...    /* PEM
15f40 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72  _write_bio_RSAPr
15f50 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73  ivateKey(out, rs
15f60 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  a, NULL, NULL, 0
15f70 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a  , NULL, NULL); *
15f80 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  /...    BIO_free
15f90 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a  _all(out);.. .}.
15fa0 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30  ...if ((cert=X50
15fb0 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20  9_new())==NULL) 
15fc0 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
15fd0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
15fe0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ror generating c
15ff0 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65  ertificate reque
16000 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  st",NULL);...   
16010 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
16020 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
16030 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
16040 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
16050 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
16060 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
16070 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16080 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
16090 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
160a0 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
160b0 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
160c0 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
160d0 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
160e0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
160f0 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65  9_getm_notBefore
16100 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30  (cert),0);...X50
16110 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
16120 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28  9_getm_notAfter(
16130 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36  cert),(long)60*6
16140 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35  0*24*days);...X5
16150 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65  09_set_pubkey(ce
16160 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d  rt,pkey);....nam
16170 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  e=X509_get_subje
16180 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a  ct_name(cert);..
16190 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
161a0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
161b0 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"C", MBSTRING_
161c0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
161d0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
161e0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
161f0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
16200 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
16210 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "ST", MBSTRING_A
16220 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
16230 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54  ned char *) k_ST
16240 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
16250 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
16260 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
16270 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "L", MBSTRING_AS
16280 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
16290 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20  ed char *) k_L, 
162a0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
162b0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
162c0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
162d0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
162e0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
162f0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31   char *) k_O, -1
16300 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
16310 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
16320 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22  by_txt(name,"OU"
16330 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
16340 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
16350 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31  char *) k_OU, -1
16360 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
16370 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
16380 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22  by_txt(name,"CN"
16390 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
163a0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
163b0 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31  char *) k_CN, -1
163c0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
163d0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
163e0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61  by_txt(name,"Ema
163f0 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  il", MBSTRING_AS
16400 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
16410 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61  ed char *) k_Ema
16420 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  il, -1, -1, 0);.
16430 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a  ...X509_set_subj
16440 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61  ect_name(cert,na
16450 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30  me);....if (!X50
16460 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79  9_sign(cert,pkey
16470 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20  ,EVP_sha256())) 
16480 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65  {...    X509_fre
16490 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45  e(cert);...    E
164a0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
164b0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
164c0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
164d0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
164e0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
164f0 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63  .#endif...    Tc
16500 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
16510 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e  rp,"Error signin
16520 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e  g certificate",N
16530 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
16540 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
16550 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20  }....if (isStr) 
16560 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
16570 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
16580 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
16590 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63  e_bio_X509(out,c
165a0 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ert);...    i=BI
165b0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
165c0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
165d0 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
165e0 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
165f0 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
16600 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
16610 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
16620 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
16630 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
16640 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
16650 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
16660 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
16670 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
16680 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
16690 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
166a0 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  pemout);...    P
166b0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
166c0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
166d0 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28     BIO_free_all(
166e0 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  out);...}....X50
166f0 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
16700 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
16710 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
16720 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
16730 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
16740 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
16750 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ndif..    }..}..
16760 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
16770 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  lt:..break;.    
16780 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
16790 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  _OK;.}.../******
167a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
167b0 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20  /* Init         
167c0 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
167d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
167e0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
167f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16820 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
16830 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Free --. *. *.
16840 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
16850 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
16860 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
16870 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
16880 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
16890 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
168a0 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20  lls below 1. *. 
168b0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
168c0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
168d0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
168e0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
168f0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16930 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
16940 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65  Tls_Free(tls_fre
16950 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72  e_type *blockPtr
16960 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
16970 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
16980 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20   *)blockPtr;..  
16990 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
169a0 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c  d");..    Tls_Cl
169b0 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ean(statePtr);. 
169c0 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50     ckfree(blockP
169d0 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
169e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a20 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61  -. *. * Tls_Clea
16a30 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  n --. *. *.This 
16a40 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
16a50 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
16a60 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
16a70 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
16a80 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
16a90 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
16aa0 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68  elow 1.  This sh
16ab0 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65  ould. *.be calle
16ac0 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20  d synchronously 
16ad0 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63  by the CloseProc
16ae0 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09  , not in the. *.
16af0 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63  EventuallyFree c
16b00 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
16b10 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
16b20 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
16b30 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
16b40 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
16b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b90 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73  ---. */.void Tls
16ba0 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74  _Clean(State *st
16bb0 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70  atePtr) {.    dp
16bc0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
16bd0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
16be0 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68  we're assuming h
16bf0 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73  ere that we're s
16c00 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20  ingle-threaded. 
16c10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73      */.    if (s
16c20 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
16c30 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
16c40 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
16c50 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
16c60 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
16c70 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
16c80 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  timer = NULL;.  
16c90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
16ca0 76 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  ve callbacks */.
16cb0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
16cc0 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54  ->callback) {..T
16cd0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
16ce0 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
16cf0 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ck);..statePtr->
16d00 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b  callback = NULL;
16d10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
16d20 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
16d30 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
16d40 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
16d50 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61  >password);..sta
16d60 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
16d70 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
16d80 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
16d90 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  vcmd) {..Tcl_Dec
16da0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
16db0 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74  tr->vcmd);..stat
16dc0 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c  ePtr->vcmd = NUL
16dd0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
16de0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
16df0 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74  os) {..ckfree(st
16e00 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b  atePtr->protos);
16e10 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
16e20 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  os = NULL;.    }
16e30 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
16e40 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54  tr->bio) {../* T
16e50 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53  his will call SS
16e60 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20  L_shutdown. Bug 
16e70 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69  1414045 */..dpri
16e80 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c  ntf("BIO_free_al
16e90 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  l(%p)", statePtr
16ea0 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65  ->bio);..BIO_fre
16eb0 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e  e_all(statePtr->
16ec0 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  bio);..statePtr-
16ed0 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >bio = NULL;.   
16ee0 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
16ef0 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70  ePtr->ssl) {..dp
16f00 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28  rintf("SSL_free(
16f10 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  %p)", statePtr->
16f20 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28  ssl);..SSL_free(
16f30 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
16f40 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d  .statePtr->ssl =
16f50 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
16f60 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
16f70 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ctx) {..SSL_CTX_
16f80 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63  free(statePtr->c
16f90 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tx);..statePtr->
16fa0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
16fb0 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
16fc0 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c  Returning");.}..
16fd0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
16fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
17020 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43 6f   * Build Info Co
17030 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43  mmand --. *. *.C
17040 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
17050 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69 6e   return build in
17060 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e 0a  fo for package..
17070 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
17080 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
17090 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69   result. *. * Si
170a0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
170b0 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e 66  reated build-inf
170c0 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a  o command.. *. *
170d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17110 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e  ------. */..#ifn
17120 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 20  def STRINGIFY.# 
17130 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46   define STRINGIF
17140 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 28  Y(x) STRINGIFY1(
17150 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52  x).#  define STR
17160 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 65  INGIFY1(x) #x.#e
17170 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 49  ndif..int.BuildI
17180 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49  nfoCommand(Tcl_I
17190 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20 7b  nterp* interp) {
171a0 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  .    Tcl_CmdInfo
171b0 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20 28   info;..    if (
171c0 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
171d0 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63  fo(interp, "::tc
171e0 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20  l::build-info", 
171f0 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43  &info)) {..Tcl_C
17200 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
17210 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
17220 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e 66  build-info", inf
17230 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64  o.objProc, (void
17240 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f 56   *)(...PACKAGE_V
17250 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e  ERSION "+" STRIN
17260 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e  GIFY(TLS_VERSION
17270 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66 69 6e  _UUID).#if defin
17280 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26  ed(__clang__) &&
17290 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67   defined(__clang
172a0 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20  _major__)....   
172b0 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e   ".clang-" STRIN
172c0 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a  GIFY(__clang_maj
172d0 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e  or__).#if __clan
172e0 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09  g_minor__ < 10..
172f0 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66  ..    "0".#endif
17300 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46  ....    STRINGIF
17310 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f  Y(__clang_minor_
17320 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  _).#endif.#if de
17330 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75  fined(__cplusplu
17340 73 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  s) && !defined(_
17350 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20  _OBJC__)....    
17360 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e  ".cplusplus".#en
17370 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  dif.#ifndef NDEB
17380 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75  UG....    ".debu
17390 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  g".#endif.#if !d
173a0 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
173b0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
173c0 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20  INTEL_COMPILER) 
173d0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55  && defined(__GNU
173e0 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63  C__)....    ".gc
173f0 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f  c-" STRINGIFY(__
17400 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e  GNUC__).#if __GN
17410 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a  UC_MINOR__ < 10.
17420 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69  ...    "0".#endi
17430 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49  f....    STRINGI
17440 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f  FY(__GNUC_MINOR_
17450 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  _).#endif.#ifdef
17460 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45   __INTEL_COMPILE
17470 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22  R....    ".icc-"
17480 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54   STRINGIFY(__INT
17490 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e  EL_COMPILER).#en
174a0 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d  dif.#ifdef TCL_M
174b0 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20  EM_DEBUG....    
174c0 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64  ".memdebug".#end
174d0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
174e0 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20  MSC_VER)....    
174f0 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49  ".msvc-" STRINGI
17500 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e  FY(_MSC_VER).#en
17510 64 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e  dif.#ifdef USE_N
17520 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d  MAKE....    ".nm
17530 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  ake".#endif.#ifn
17540 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49  def TCL_CFG_OPTI
17550 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e  MIZED....    ".n
17560 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64  o-optimize".#end
17570 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43  if.#ifdef __OBJC
17580 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65  __....    ".obje
17590 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66  ctive-c".#if def
175a0 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73  ined(__cplusplus
175b0 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c  )....    "pluspl
175c0 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  us".#endif.#endi
175d0 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47  f.#ifdef TCL_CFG
175e0 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20  _PROFILED....   
175f0 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64   ".profile".#end
17600 69 66 0a 23 69 66 64 65 66 20 50 55 52 49 46 59  if.#ifdef PURIFY
17610 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69 66 79  ....    ".purify
17620 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
17630 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09  STATIC_BUILD....
17640 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65      ".static".#e
17650 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b  ndif...), NULL);
17660 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17670 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
17680 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
17690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
176c0 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 20   TlsLibShutdown 
176d0 2d 2d 0a 20 2a 0a 20 2a 09 53 68 75 74 64 6f 77  --. *. *.Shutdow
176e0 6e 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e  n SSL library on
176f0 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69  ce per applicati
17700 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  on. *. * Results
17710 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
17720 54 43 4c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a  TCL result. *. *
17730 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
17740 2a 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c  *.Shutdown SSL l
17750 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ibrary. *. *----
17760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17790 2d 2d 2a 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73  --*. */.void Tls
177a0 4c 69 62 53 68 75 74 64 6f 77 6e 28 43 6c 69 65  LibShutdown(Clie
177b0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
177c0 61 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  a) {.    dprintf
177d0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
177e0 20 42 49 4f 5f 63 6c 65 61 6e 75 70 28 29 3b 0a   BIO_cleanup();.
177f0 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
17800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
17830 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74   *. *.TlsLibInit
17840 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61   --. *. *.Initia
17850 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
17860 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69  y once per appli
17870 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73  cation. *. * Res
17880 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
17890 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20  ard Tcl result. 
178a0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
178b0 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  s:. *.Initialize
178c0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
178d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
178e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73  ---------*. */.s
17910 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62  tatic int TlsLib
17920 49 6e 69 74 28 29 20 7b 0a 20 20 20 20 73 74 61  Init() {.    sta
17930 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69  tic int initiali
17940 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  zed = 0;..    dp
17950 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
17960 0a 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74 69  ..    if (!initi
17970 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49 6e  alized) {../* In
17980 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69  itialize BOTH li
17990 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73  bcrypto and libs
179a0 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50 45  sl. */..if (!OPE
179b0 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50  NSSL_init_ssl(OP
179c0 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
179d0 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50  SSL_STRINGS | OP
179e0 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
179f0 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09  CRYPTO_STRINGS..
17a00 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e      | OPENSSL_IN
17a10 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45  IT_ADD_ALL_CIPHE
17a20 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  RS | OPENSSL_INI
17a30 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54  T_ADD_ALL_DIGEST
17a40 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c  S..    | OPENSSL
17a50 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49  _INIT_LOAD_CONFI
17a60 47 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  G | OPENSSL_INIT
17a70 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b  _ASYNC, NULL)) {
17a80 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
17a90 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
17aa0 43 72 65 61 74 65 20 42 49 4f 20 68 61 6e 64 6c  Create BIO handl
17ab0 65 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f  ers */..BIO_new_
17ac0 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09  tcl(NULL, 0);...
17ad0 2f 2a 20 43 72 65 61 74 65 20 65 78 69 74 20 68  /* Create exit h
17ae0 61 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c 5f 43  andler */..Tcl_C
17af0 72 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65 72  reateExitHandler
17b00 28 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 2c  (TlsLibShutdown,
17b10 20 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69 61 6c   NULL);..initial
17b20 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ized = 1;.    }.
17b30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
17b40 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73  K;.}.../* Init s
17b50 63 72 69 70 74 20 2a 2f 0a 73 74 61 74 69 63 20  cript */.static 
17b60 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63  const char tlsTc
17b70 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20  lInitScript[] = 
17b80 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e  {.#include "tls.
17b90 74 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a  tcl.h".};../*. *
17ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17be0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e  ---. *. * Tls_In
17bf0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  it --. *. *.This
17c00 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e   is a package in
17c10 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
17c20 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73  cedure, which is
17c30 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 43   called. *.by TC
17c40 4c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b  L when this pack
17c50 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64  age is to be add
17c60 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72  ed to an interpr
17c70 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  eter.. *. * Resu
17c80 6c 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69  lts:. *.Initiali
17c90 7a 65 73 20 73 74 72 75 63 74 75 72 65 73 20 61  zes structures a
17ca0 6e 64 20 63 72 65 61 74 65 73 20 63 6f 6d 6d 61  nd creates comma
17cb0 6e 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  nds.. *. * Side 
17cc0 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 43 72 65  effects:. *. Cre
17cd0 61 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73  ate the commands
17ce0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
17cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23  ---------. */..#
17d30 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  if TCL_MAJOR_VER
17d40 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65  SION > 8.#define
17d50 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e   MIN_VERSION "9.
17d60 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  0".#else.#define
17d70 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e   MIN_VERSION "8.
17d80 35 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 45 58  5".#endif..DLLEX
17d90 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69  PORT int Tls_Ini
17da0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17db0 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70 72  terp) {..    dpr
17dc0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
17dd0 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f  .#ifdef USE_TCL_
17de0 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63  STUBS.    if (Tc
17df0 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
17e00 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c  rp, MIN_VERSION,
17e10 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09   0) == NULL) {..
17e20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17e30 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
17e40 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71    if (Tcl_PkgReq
17e50 75 69 72 65 45 78 28 69 6e 74 65 72 70 2c 20 22  uireEx(interp, "
17e60 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f  Tcl", MIN_VERSIO
17e70 4e 2c 20 30 2c 20 4e 55 4c 4c 29 20 3d 3d 20 4e  N, 0, NULL) == N
17e80 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
17e90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
17ea0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
17eb0 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 21 3d 20  TlsLibInit() != 
17ec0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41  TCL_OK) {..Tcl_A
17ed0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17ee0 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
17ef0 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
17f00 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29  brary", (char *)
17f10 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
17f20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
17f30 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
17f40 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
17f50 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65  p, "::tls::ciphe
17f60 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43  rs", CiphersObjC
17f70 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
17f80 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
17f90 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
17fa0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
17fb0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
17fc0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e  erp, "::tls::con
17fd0 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63  nection", Connec
17fe0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20  tionInfoObjCmd, 
17ff0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
18000 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
18010 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
18020 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
18030 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
18040 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68 61   "::tls::handsha
18050 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62  ke", HandshakeOb
18060 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
18070 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
18080 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
18090 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
180a0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
180b0 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69  nterp, "::tls::i
180c0 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62  mport", ImportOb
180d0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
180e0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
180f0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
18100 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
18110 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
18120 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75  nterp, "::tls::u
18130 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f  nimport", Unimpo
18140 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rtObjCmd, (Clien
18150 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
18160 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
18170 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
18180 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
18190 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
181a0 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 69  s::unstack", Uni
181b0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
181c0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
181d0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
181e0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
181f0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
18200 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
18210 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53  :tls::status", S
18220 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  tatusObjCmd, (Cl
18230 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
18240 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
18250 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
18260 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
18270 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
18280 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20  :tls::version", 
18290 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28  VersionObjCmd, (
182a0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
182b0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
182c0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
182d0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
182e0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
182f0 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d  "::tls::misc", M
18300 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  iscObjCmd, (Clie
18310 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
18320 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
18330 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
18340 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
18350 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
18360 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20  ls::protocols", 
18370 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c  ProtocolsObjCmd,
18380 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
18390 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
183a0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
183b0 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43  ..    BuildInfoC
183c0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a  ommand(interp);.
183d0 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20  .    if (interp 
183e0 26 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65  && Tcl_Eval(inte
183f0 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63  rp, tlsTclInitSc
18400 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ript) != TCL_OK)
18410 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
18420 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
18430 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50   return Tcl_PkgP
18440 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50  rovide(interp, P
18450 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43  ACKAGE_NAME, PAC
18460 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d  KAGE_VERSION);.}
18470 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
18480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
184a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
184b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
184c0 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d  .Tls_SafeInit --
184d0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
184e0 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
184f0 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
18500 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72  e for safe inter
18510 70 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ps.. *. * Result
18520 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f 66  s:. *.Same as of
18530 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20   'Tls_Init'. *. 
18540 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
18550 20 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54   *.Same as of 'T
18560 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 2d 2d  ls_Init'. *. *--
18570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
185a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
185b0 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20  -. */.DLLEXPORT 
185c0 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74  int Tls_SafeInit
185d0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
185e0 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e  erp) {.    dprin
185f0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20  tf("Called");.  
18600 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69    return Tls_Ini
18610 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a           t(interp);.}.