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: 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54  NULL : \...Tcl_T
0550: 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
0560: 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20  (interp, (key), 
0570: 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20  (dsp)))..static 
0580: 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69  SSL_CTX *CTX_Ini
0590: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
05a0: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
05b0: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
05c0: 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63   *key,...char *c
05d0: 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65  ertfile, unsigne
05e0: 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31  d char *key_asn1
05f0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
0600: 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 54 63  *cert_asn1,...Tc
0610: 6c 5f 53 69 7a 65 20 6b 65 79 5f 61 73 6e 31 5f  l_Size key_asn1_
0620: 6c 65 6e 2c 20 54 63 6c 5f 53 69 7a 65 20 63 65  len, Tcl_Size ce
0630: 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61  rt_asn1_len, cha
0640: 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20  r *CApath, char 
0650: 2a 43 41 73 74 6f 72 65 2c 0a 09 09 63 68 61 72  *CAstore,...char
0660: 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a   *CAfile, char *
0670: 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63  ciphers, char *c
0680: 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74  iphersuites, int
0690: 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48   level, char *DH
06a0: 70 61 72 61 6d 73 29 3b 0a 0a 23 64 65 66 69 6e  params);..#defin
06b0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
06c0: 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54  ..0x01.#define T
06d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30  LS_PROTO_SSL3..0
06e0: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x02.#define TLS_
06f0: 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34  PROTO_TLS1..0x04
0700: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0710: 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23  TO_TLS1_1.0x08.#
0720: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0730: 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65  _TLS1_2.0x10.#de
0740: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
0750: 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69  LS1_3.0x20.#defi
0760: 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c  ne ENABLED(flag,
0770: 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20   mask).(((flag) 
0780: 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61  & (mask)) == (ma
0790: 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53 53  sk))..#define SS
07a0: 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53 53  LKEYLOGFILE.."SS
07b0: 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 0c 0a  LKEYLOGFILE"....
07c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
07d0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61  *****/./* Callba
07e0: 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a  cks        */./*
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 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 0a 20  --------------. 
0850: 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62 61  *. * Eval Callba
0860: 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a  ck Command --. *
0870: 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61 63  . *.Eval callbac
0880: 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 61  k command and ca
0890: 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 0a 20  tch any errors. 
08a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
08b0: 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74  .0 = Command ret
08c0: 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 65 76  urned fail or ev
08d0: 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f  al returned TCL_
08e0: 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f 6d  ERROR. *.1 = Com
08f0: 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 73 75  mand returned su
0900: 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 72 65  ccess or eval re
0910: 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a  turned TCL_OK. *
0920: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0930: 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 20 63  :. *.Evaluates c
0940: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a  allback command.
0950: 20 2a 0a 20 2a 2d 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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
09a0: 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c 6c  tic int.EvalCall
09b0: 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70 20  back(Tcl_Interp 
09c0: 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 20 2a  *interp, State *
09d0: 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62  statePtr, Tcl_Ob
09e0: 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20 20  j *cmdPtr) {.   
09f0: 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d 20   int code, ok = 
0a00: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
0a10: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
0a20: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 6f  Tcl_Preserve((vo
0a30: 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20  id *) interp);. 
0a40: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
0a50: 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74  (void *) statePt
0a60: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
0a70: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73   callback with s
0a80: 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72  uccess for ok or
0a90: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c   return value 1,
0aa0: 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20   fail for error 
0ab0: 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  or return value 
0ac0: 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73  0 */.    Tcl_Res
0ad0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
0ae0: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
0af0: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
0b00: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
0b10: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
0b20: 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61   dprintf("EvalCa
0b30: 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64  llback: %d", cod
0b40: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65  e);.    if (code
0b50: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f   == TCL_OK) {../
0b60: 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66  * Check result f
0b70: 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  or return value 
0b80: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73  */..Tcl_Obj *res
0b90: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
0ba0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
0bb0: 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e  .if (result == N
0bc0: 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  ULL || Tcl_GetIn
0bd0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
0be0: 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d   result, &ok) !=
0bf0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
0c00: 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69  ok = 1;..}..dpri
0c10: 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22  ntf("Result: %d"
0c20: 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73  , ok);.    } els
0c30: 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20  e {../* Error - 
0c40: 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69  reject the certi
0c50: 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e  ficate */..dprin
0c60: 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75  tf("Tcl_Backgrou
0c70: 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28  ndError");.#if (
0c80: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
0c90: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
0ca0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
0cb0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
0cc0: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
0cd0: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
0ce0: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
0cf0: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
0d00: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
0d10: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f   Tcl_Release((vo
0d20: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  id *) statePtr);
0d30: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
0d40: 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70  ((void *) interp
0d50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b  );.    return ok
0d60: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20  --------------. 
0db0: 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63  *. * InfoCallbac
0dc0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74  k --. *. *.Monit
0dd0: 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69  ors SSL connecti
0de0: 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a  on process. *. *
0df0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
0e00: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
0e10: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
0e20: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
0e30: 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ned). *. *------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
0e80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e  /.static void.In
0e90: 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  foCallback(const
0ea0: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77   SSL *ssl, int w
0eb0: 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b  here, int ret) {
0ec0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
0ed0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53  ePtr = (State*)S
0ee0: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
0ef0: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20  (SSL *)ssl);.   
0f00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0f10: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
0f20: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
0f30: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
0f40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61 6a   const char *maj
0f50: 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20  or, *minor;..   
0f60: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
0f70: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
0f80: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
0f90: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
0fa0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  L) {..return;.  
0fb0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 68 65    }..    if (whe
0fc0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44  re & SSL_CB_HAND
0fd0: 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09  SHAKE_START) {..
0fe0: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61  major = "handsha
0ff0: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73  ke";..minor = "s
1000: 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73  tart";.    } els
1010: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1020: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44  L_CB_HANDSHAKE_D
1030: 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20  ONE) {..major = 
1040: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69  "handshake";..mi
1050: 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20  nor = "done";.  
1060: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
1070: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41  where & SSL_CB_A
1080: 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22  LERT)..major = "
1090: 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66  alert";..else if
10a0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54   (where & SSL_ST
10b0: 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20  _CONNECT).major 
10c0: 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c  = "connect";..el
10d0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
10e0: 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d  SL_ST_ACCEPT)..m
10f0: 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b  ajor = "accept";
1100: 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72  ..else.....major
1110: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09   = "unknown";...
1120: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1130: 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20  CB_READ)..minor 
1140: 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20  = "read";..else 
1150: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1160: 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72  CB_WRITE)..minor
1170: 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73   = "write";..els
1180: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1190: 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f  L_CB_LOOP)..mino
11a0: 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73  r = "loop";..els
11b0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
11c0: 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f  L_CB_EXIT)..mino
11d0: 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73  r = "exit";..els
11e0: 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75  e.....minor = "u
11f0: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a  nknown";.    }..
1200: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
1210: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
1220: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 6a  th fn, chan, maj
1230: 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 61  or, minor, messa
1240: 67 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72 67  ge, and type arg
1250: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
1260: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
1270: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
1280: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
1290: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
12b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
12c0: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31  ngObj("info", -1
12d0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
12e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12f0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1300: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1310: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
1320: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
1330: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
1340: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1350: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1360: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1370: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
1380: 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ajor, -1));.    
1390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13b0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
13c0: 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c  StringObj(minor,
13d0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 28   -1));..    if (
13e0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41  where & SSL_CB_A
13f0: 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  LERT) {..Tcl_Lis
1400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1410: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1420: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1430: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
1440: 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f  t_desc_string_lo
1450: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09  ng(ret), -1));..
1460: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1470: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1480: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1490: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
14a0: 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74  SL_alert_type_st
14b0: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20  ring_long(ret), 
14c0: 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  -1));.    } else
14d0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
14e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14f0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1500: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1510: 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  bj(SSL_state_str
1520: 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
1530: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
1540: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1550: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1560: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1570: 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  "info", -1));.  
1580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c    }..    /* Eval
1590: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
15a0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
15b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
15c0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
15d0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
15e0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
15f0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1600: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c  unt(cmdPtr);.}..
1610: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1620: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20  ---------. *. * 
1660: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 20  MessageCallback 
1670: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
1680: 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d  s SSL protocol m
1690: 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65  essages. *. * Re
16a0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
16b0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
16c0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
16d0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
16e0: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23  ----------. */.#
1730: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  ifndef OPENSSL_N
1740: 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 74  O_SSL_TRACE.stat
1750: 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 43  ic void.MessageC
1760: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 74  allback(int writ
1770: 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f 6e  e_p, int version
1780: 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 79  , int content_ty
1790: 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  pe, const void *
17a0: 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 2c  buf, size_t len,
17b0: 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 20   SSL *ssl, void 
17c0: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
17d0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
17e0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
17f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1800: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
1810: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
1820: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
1830: 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 3b  har *ver, *type;
1840: 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 20  .    BIO *bio;. 
1850: 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31     char buffer[1
1860: 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 65  5000];.    buffe
1870: 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 64  r[0] = 0;..    d
1880: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
1890: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
18a0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
18b0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
18c0: 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20   {..return;.    
18d0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76 65  }..    switch(ve
18e0: 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50 45  rsion) {.#if OPE
18f0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
1900: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
1910: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f  L && !defined(NO
1920: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
1930: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
1940: 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c  L2).    case SSL
1950: 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  2_VERSION:..ver 
1960: 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65 61  = "SSLv2";..brea
1970: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
1980: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
1990: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
19a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
19b0: 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53 49   case SSL3_VERSI
19c0: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76  ON:..ver = "SSLv
19d0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  3";..break;.#end
19e0: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  if.    case TLS1
19f0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1a00: 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61 6b   "TLSv1";..break
1a10: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f  ;.    case TLS1_
1a20: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1a30: 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62 72  = "TLSv1.1";..br
1a40: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c  eak;.    case TL
1a50: 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  S1_2_VERSION:..v
1a60: 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b 0a  er = "TLSv1.2";.
1a70: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1a80: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 3a   TLS1_3_VERSION:
1a90: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 33  ..ver = "TLSv1.3
1aa0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1ab0: 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22 6e  ase 0:..ver = "n
1ac0: 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  one";..break;.  
1ad0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20    default:..ver 
1ae0: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72  = "unknown";..br
1af0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1b00: 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f  switch (content_
1b10: 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65  type) {.    case
1b20: 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a   SSL3_RT_HEADER:
1b30: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72  ..type = "Header
1b40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b50: 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45  ase SSL3_RT_INNE
1b60: 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a  R_CONTENT_TYPE:.
1b70: 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43  .type = "Inner C
1b80: 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09 62  ontent Type";..b
1b90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1ba0: 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49  SL3_RT_CHANGE_CI
1bb0: 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65  PHER_SPEC:..type
1bc0: 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68 65   = "Change Ciphe
1bd0: 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  r";..break;.    
1be0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45  case SSL3_RT_ALE
1bf0: 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c 65  RT:..type = "Ale
1c00: 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  rt";..break;.   
1c10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 41   case SSL3_RT_HA
1c20: 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20 3d  NDSHAKE:..type =
1c30: 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09 62   "Handshake";..b
1c40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1c50: 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54 49  SL3_RT_APPLICATI
1c60: 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20 3d  ON_DATA:..type =
1c70: 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62 72   "App Data";..br
1c80: 65 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  eak;.#if OPENSSL
1c90: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
1ca0: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 20  < 0x30000000L.  
1cb0: 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f    case DTLS1_RT_
1cc0: 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65  HEARTBEAT:..type
1cd0: 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a   = "Heartbeat";.
1ce0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
1cf0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 70     default:..typ
1d00: 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  e = "unknown";. 
1d10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 65     }..    /* Nee
1d20: 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  ds compile time 
1d30: 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d 73  option "enable-s
1d40: 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 20  sl-trace". */.  
1d50: 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 4f    if ((bio = BIO
1d60: 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
1d70: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  )) != NULL) {..i
1d80: 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 65  nt n;..SSL_trace
1d90: 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 6f  (write_p, versio
1da0: 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c  n, content_type,
1db0: 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20   buf, len, ssl, 
1dc0: 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 6e  (void *)bio);..n
1dd0: 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c   = BIO_read(bio,
1de0: 20 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65 6e   buffer, BIO_pen
1df0: 64 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30 30  ding(bio) < 1500
1e00: 30 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28  0 ? BIO_pending(
1e10: 62 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a 09  bio) : 14999);..
1e20: 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20  n = (n<0) ? 0 : 
1e30: 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20  n;..buffer[n] = 
1e40: 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c  0;..(void)BIO_fl
1e50: 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66  ush(bio);..BIO_f
1e60: 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a  ree(bio);.   }..
1e70: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4d 65 73      dprintf("Mes
1e80: 73 61 67 65 20 64 69 72 65 63 74 69 6f 6e 3d 25  sage direction=%
1e90: 64 2c 20 76 65 72 3d 25 73 2c 20 74 79 70 65 3d  d, ver=%s, type=
1ea0: 25 73 2c 20 6d 65 73 73 61 67 65 3d 25 73 22 2c  %s, message=%s",
1eb0: 20 77 72 69 74 65 5f 70 2c 20 76 65 72 2c 20 74   write_p, ver, t
1ec0: 79 70 65 2c 20 26 62 75 66 66 65 72 5b 30 5d 29  ype, &buffer[0])
1ed0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
1ee0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
1ef0: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
1f00: 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72 73 69  direction, versi
1f10: 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d 65  on, type, and me
1f20: 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20  ssage args */.  
1f30: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1f40: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1f50: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1f60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1f70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1f80: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1f90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1fa0: 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a  message", -1));.
1fb0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1fc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1fd0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1fe0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1ff0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2000: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2010: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2020: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2030: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2040: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2050: 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65  wStringObj(write
2060: 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52  _p ? "Sent" : "R
2070: 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a  eceived", -1));.
2080: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2090: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
20a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
20b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65  _NewStringObj(ve
20c0: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  r, -1));.    Tcl
20d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
20e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
20f0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2100: 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29  ingObj(type, -1)
2110: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2120: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2130: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2140: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2150: 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a  (buffer, -1));..
2160: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
2170: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
2180: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
2190: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
21a0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
21b0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
21c0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
21d0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
21e0: 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  mdPtr);.}.#endif
21f0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
2240: 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  * VerifyCallback
2250: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
2260: 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 61  rs SSL certifica
2270: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72  te validation pr
2280: 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63  ocess. Used to c
2290: 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65  ontrol the. *.be
22a0: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20  havior when the 
22b0: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20  SSL_VERIFY_PEER 
22c0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
22d0: 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77  s is called. *.w
22e0: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66  henever a certif
22f0: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74  icate is inspect
2300: 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e  ed or decided in
2310: 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f  valid. Called fo
2320: 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 66  r. *.each certif
2330: 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 72  icate in the cer
2340: 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43  t chain.. *. * C
2350: 68 65 63 6b 73 3a 0a 20 2a 09 54 68 65 20 63 65  hecks:. *.The ce
2360: 72 74 69 66 69 63 61 74 65 20 63 68 61 69 6e 20  rtificate chain 
2370: 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 72 74  is checked start
2380: 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 65 65  ing with the dee
2390: 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 76  pest nesting lev
23a0: 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 6f 6f  el. *.  (the roo
23b0: 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65  t CA certificate
23c0: 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 77  ) and worked upw
23d0: 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 72 27  ard to the peer'
23e0: 73 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20  s certificate.. 
23f0: 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 73  *.All signatures
2400: 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 72 72   are valid, curr
2410: 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 74 68  ent time is with
2420: 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73  in first and las
2430: 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d 65 2e  t validity time.
2440: 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74  . *.Check that t
2450: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
2460: 73 20 69 73 73 75 65 64 20 62 79 20 74 68 65 20  s issued by the 
2470: 69 73 73 75 65 72 20 63 65 72 74 69 66 69 63 61  issuer certifica
2480: 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 68  te issuer.. *.Ch
2490: 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 74 69  eck the revocati
24a0: 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 65 61  on status for ea
24b0: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a  ch certificate..
24c0: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 61 6c   *.Check the val
24d0: 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 69 76  idity of the giv
24e0: 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 20 63  en CRL and the c
24f0: 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 73  ert revocation s
2500: 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20  tatus.. *.Check 
2510: 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 20  the policies of 
2520: 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 69 63  all the certific
2530: 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a  ates. *. * Args.
2540: 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f 6b 20   *.preverify_ok 
2550: 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65  indicates whethe
2560: 72 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  r the certificat
2570: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70  e verification p
2580: 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e 6f 74  assed (1) or not
2590: 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c   (0). *. * Resul
25a0: 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63  ts:. *.A callbac
25b0: 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73  k bound to the s
25c0: 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e  ocket may return
25d0: 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20   one of:. *.    
25e0: 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  0...- the certif
25f0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
2600: 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 65  invalid, send ve
2610: 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09  rification. *...
2620: 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 72 74  .  failure alert
2630: 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 65   to peer, and te
2640: 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 61 6b  rminate handshak
2650: 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20  e.. *.    1...- 
2660: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2670: 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 64 2c  is deemed valid,
2680: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 68   continue with h
2690: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20  andshake.. *.   
26a0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20   empty string.- 
26b0: 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72  no change to cer
26c0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
26d0: 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ion. *. * Side e
26e0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65  ffects:. *.The e
26f0: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  rr field of the 
2700: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74  currently operat
2710: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74  ive State is set
2720: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e  . *.  to a strin
2730: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
2740: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
2750: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a   failure reason.
2760: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
27b0: 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61  tic int.VerifyCa
27c0: 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58  llback(int ok, X
27d0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63  509_STORE_CTX *c
27e0: 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  tx) {.    Tcl_Ob
27f0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 53  j *cmdPtr;.    S
2800: 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53  SL   *ssl..= (SS
2810: 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  L*)X509_STORE_CT
2820: 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74  X_get_ex_data(ct
2830: 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61  x, SSL_get_ex_da
2840: 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  ta_X509_STORE_CT
2850: 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35  X_idx());.    X5
2860: 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30  09  *cert..= X50
2870: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
2880: 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78  current_cert(ctx
2890: 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  );.    State *st
28a0: 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a  atePtr.= (State*
28b0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
28c0: 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  a(ssl);.    Tcl_
28d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
28e0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
28f0: 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 68  p;.    int depth
2900: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
2910: 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 70  TX_get_error_dep
2920: 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e 74  th(ctx);.    int
2930: 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54 4f   err..= X509_STO
2940: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72  RE_CTX_get_error
2950: 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 69  (ctx);..    dpri
2960: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
2970: 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69     dprintf("Veri
2980: 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c  fyCallback: %d",
2990: 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73   ok);..    if (s
29a0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
29b0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
29c0: 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61   {../* Use ok va
29d0: 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 61 74  lue if verificat
29e0: 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
29f0: 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72  */..if (statePtr
2a00: 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56  ->vflags & SSL_V
2a10: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
2a20: 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20  _PEER_CERT) {.. 
2a30: 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d     return ok;..}
2a40: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74   else {..    ret
2a50: 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20  urn 1;..}.    } 
2a60: 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 3d 3d  else if (cert ==
2a70: 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20   NULL || ssl == 
2a80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
2a90: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  0;.    }..    dp
2aa0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c  rintf("VerifyCal
2ab0: 6c 62 61 63 6b 3a 20 63 72 65 61 74 65 20 63 61  lback: create ca
2ac0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 29  llback command")
2ad0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
2ae0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
2af0: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
2b00: 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f  depth, cert info
2b10: 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61   list, status, a
2b20: 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f  nd error args */
2b30: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
2b40: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
2b50: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
2b60: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2b70: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2b80: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2b90: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76  _NewStringObj("v
2ba0: 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20  erify", -1));.  
2bb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2bc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2bd0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f  p, cmdPtr,..Tcl_
2be0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
2bf0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
2c00: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
2c10: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2c20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2c40: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
2c50: 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54  j(depth));.    T
2c60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2c80: 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58  cmdPtr, Tls_NewX
2c90: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63  509Obj(interp, c
2ca0: 65 72 74 2c 20 30 29 29 3b 0a 20 20 20 20 54 63  ert, 0));.    Tc
2cb0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2cc0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2cd0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
2ce0: 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54  tObj(ok));.    T
2cf0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2d00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2d10: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
2d20: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
2d30: 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72  )X509_verify_cer
2d40: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65  t_error_string(e
2d50: 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  rr), -1));..    
2d60: 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 77  /* Prevent I/O w
2d70: 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 73  hile callback is
2d80: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f 0a   in progress */.
2d90: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2da0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
2db0: 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a  L_CALLBACK; */..
2dc0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2dd0: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61  ifyCallback: eva
2de0: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20  l callback");.. 
2df0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
2e00: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
2e10: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
2e20: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
2e30: 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61   ok = EvalCallba
2e40: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
2e50: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
2e60: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2e70: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
2e80: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2e90: 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e  Callback: comman
2ea0: 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 2c 20  d result = %d", 
2eb0: 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61  ok);..    /* sta
2ec0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20  tePtr->flags &= 
2ed0: 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  ~(TLS_TCL_CALLBA
2ee0: 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
2ef0: 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66  rn ok;./* By def
2f00: 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69  ault, leave veri
2f10: 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  fication unchang
2f20: 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ed. */.}.../*. *
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72  ---. *. * Tls_Er
2f80: 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ror --. *. *.Cal
2f90: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ls callback with
2fa0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
2fb0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2fc0: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
2fd0: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
2fe0: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
2ff0: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
3000: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
3010: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
3020: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
3030: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20  lure reason. *. 
3040: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c  ----. */.void.Tl
3090: 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73  s_Error(State *s
30a0: 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 20 63  tatePtr, const c
30b0: 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20  har *msg) {.    
30c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
30d0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
30e0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
30f0: 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73  bj *cmdPtr, *lis
3100: 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  tPtr;.    unsign
3110: 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20  ed long err;.   
3120: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d   statePtr->err =
3130: 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e   msg;..    dprin
3140: 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 20  tf("Called with 
3150: 6d 65 73 73 61 67 65 20 25 73 22 2c 20 6d 73 67  message %s", msg
3160: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
3170: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
3180: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
3190: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ) {..return;.   
31a0: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
31b0: 22 54 6c 73 5f 45 72 72 6f 72 3a 20 63 72 65 61  "Tls_Error: crea
31c0: 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  te callback comm
31d0: 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  and");..    /* C
31e0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
31f0: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
3200: 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 65  han, and message
3210: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
3220: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
3230: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
3240: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
3250: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3260: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3270: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3280: 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72  StringObj("error
3290: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
32a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
32b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
32c0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
32d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
32e0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
32f0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
3300: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73  -1));.    if (ms
3310: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  g != NULL) {..Tc
3320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3330: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3340: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3350: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
3360: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
3370: 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65  f ((msg = Tcl_Ge
3380: 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 4f  tString(Tcl_GetO
3390: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
33a0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) != NULL) {..T
33b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
33c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
33d0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
33e0: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
33f0: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
3400: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c  {..listPtr = Tcl
3410: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
3420: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65  ULL);..while ((e
3430: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72  rr = ERR_get_err
3440: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20  or()) != 0) {.. 
3450: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3470: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
3480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52  _NewStringObj(ER
3490: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
34a0: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
34b0: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ;..}..Tcl_ListOb
34c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
34d0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c  nterp, cmdPtr, l
34e0: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  istPtr);.    }..
34f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
3500: 5f 45 72 72 6f 72 3a 20 65 76 61 6c 20 63 61 6c  _Error: eval cal
3510: 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a  lback");..    /*
3520: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
3530: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
3540: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
3550: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
3560: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
3570: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
3580: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
3590: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
35a0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
35f0: 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  *. * KeyLogCallb
3600: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69  ack --. *. *.Wri
3610: 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20  te received key 
3620: 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65  data to log file
3630: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
3640: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ects:. *.none. *
3650: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 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 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
36a0: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63  KeyLogCallback(c
36b0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
36c0: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29  onst char *line)
36d0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72   {.    char *str
36e0: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59   = getenv(SSLKEY
36f0: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49  LOGFILE);.    FI
3700: 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72  LE *fd;..    dpr
3710: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
3720: 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a  .    if (str) {.
3730: 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c  .fd = fopen(str,
3740: 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28   "a");..fprintf(
3750: 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29  fd, "%s\n",line)
3760: 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20  ;..fclose(fd);. 
3770: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64  -. *. * Password
37d0: 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a   Callback --. *.
37e0: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.Called when a
37f0: 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65 65   password is nee
3800: 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 61 74  ded for a privat
3810: 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 64 69  e key when loadi
3820: 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 6e 67  ng. *.or storing
3830: 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 63 61   a PEM certifica
3840: 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74 69  te with encrypti
3850: 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61  on. Evals callba
3860: 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 6e 64  ck. *.script and
3870: 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65 73   returns the res
3880: 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73 77  ult as the passw
3890: 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75  ord string in bu
38a0: 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  f.. *. * Results
38b0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
38c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
38d0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
38e0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
38f0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50   * Returns:. *.P
3900: 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20  assword size in 
3910: 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20  bytes or -1 for 
3920: 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d  an error.. *. *-
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
3980: 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61  t.PasswordCallba
3990: 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e  ck(char *buf, in
39a0: 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c  t size, int rwfl
39b0: 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29  ag, void *udata)
39c0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
39d0: 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20  atePtr.= (State 
39e0: 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63  *) udata;.    Tc
39f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3a00: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
3a10: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
3a20: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
3a30: 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 6c 5f  t code;.    Tcl_
3a40: 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 64  Size len;..    d
3a50: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
3a60: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ;..    /* If no 
3a70: 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64 65  callback, use de
3a80: 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a  fault callback *
3a90: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
3aa0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20  tr->password == 
3ab0: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c  NULL) {..if (Tcl
3ac0: 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20  _EvalEx(interp, 
3ad0: 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c  "tls::password",
3ae0: 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
3af0: 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  OBAL) == TCL_OK)
3b00: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65   {..    char *re
3b10: 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c  t = (char *) Tcl
3b20: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
3b30: 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  j(Tcl_GetObjResu
3b40: 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e  lt(interp), &len
3b50: 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20  );..    if (len 
3b60: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  > (Tcl_Size) siz
3b70: 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 28  e-1) {...len = (
3b80: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31  Tcl_Size) size-1
3b90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 74  ;..    }..    st
3ba0: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20  rncpy(buf, ret, 
3bb0: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09  (size_t) len);..
3bc0: 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 27      buf[len] = '
3bd0: 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  \0';..    return
3be0: 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 65   (int) len;..} e
3bf0: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72  lse {..    retur
3c00: 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  n -1;..}.    }..
3c10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 50 61 73      dprintf("Pas
3c20: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 3a 20 63  swordCallback: c
3c30: 72 65 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63  reate callback c
3c40: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f  ommand");..    /
3c50: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
3c60: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
3c70: 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 69  , rwflag, and si
3c80: 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  ze args */.    c
3c90: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
3ca0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
3cb0: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20  r->password);.  
3cc0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3cd0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3ce0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3cf0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73  ewStringObj("pas
3d00: 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20  sword", -1));.  
3d10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3d20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3d30: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3d40: 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29  ewIntObj(rwflag)
3d50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3d60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3d70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3d80: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69  Tcl_NewIntObj(si
3d90: 7a 65 29 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ze));..    dprin
3da0: 74 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c 6c  tf("PasswordCall
3db0: 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62  back: eval callb
3dc0: 61 63 6b 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ack");..    Tcl_
3dd0: 50 72 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a  Preserve((void *
3de0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
3df0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 6f 69  cl_Preserve((voi
3e00: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  d *) statePtr);.
3e10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3e20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3e30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3e40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3e50: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
3e60: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
3e70: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
3e80: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66  _GLOBAL);.    if
3e90: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
3ea0: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
3eb0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
3ec0: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
3ed0: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
3ee0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
3ef0: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
3f00: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3f10: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
3f20: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20   code);.#endif. 
3f30: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
3f40: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3f50: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
3f60: 61 73 65 28 28 76 6f 69 64 20 2a 29 20 73 74 61  ase((void *) sta
3f70: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3f80: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  If successful, p
3f90: 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72  ass back passwor
3fa0: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75  d string and tru
3fb0: 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e  ncate if too lon
3fc0: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64  g */.    if (cod
3fd0: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
3fe0: 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61  char *ret = (cha
3ff0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69  r *) Tcl_GetStri
4000: 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65  ngFromObj(Tcl_Ge
4010: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
4020: 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  p), &len);..if (
4030: 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29  len > (Tcl_Size)
4040: 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20   size-1) {..    
4050: 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29  len = (Tcl_Size)
4060: 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72   size-1;..}..str
4070: 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28  ncpy(buf, ret, (
4080: 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62  size_t) len);..b
4090: 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  uf[len] = '\0';.
40a0: 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f  .Tcl_Release((vo
40b0: 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 09  id *) interp);..
40c0: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
40d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
40e0: 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29  Release((void *)
40f0: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65   interp);.    re
4100: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a  turn -1;.}.../*.
4110: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 53 65 73 73  -----. *. * Sess
4160: 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ion Callback for
4170: 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20   Clients --. *. 
4180: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.Called when a 
4190: 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61  new session is a
41a0: 64 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68  dded to the cach
41b0: 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a  e. In TLS 1.3. *
41c0: 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63  .this may be rec
41d0: 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  eived multiple t
41e0: 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68  imes after the h
41f0: 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a  andshake. For. *
4200: 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e  .earlier version
4210: 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
4220: 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20  received during 
4230: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20  the handshake.. 
4240: 2a 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72  *.This is the pr
4250: 65 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f  eferred way to o
4260: 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c  btain a resumabl
4270: 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a  e session.. *. *
4280: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4290: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
42a0: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
42b0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
42c0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
42d0: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20  n codes:. *.0 = 
42e0: 65 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73  error where sess
42f0: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65  ion will be imme
4300: 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20  diately removed 
4310: 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61  from the interna
4320: 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20  l cache.. *.1 = 
4330: 73 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70  success where ap
4340: 70 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f  p retains sessio
4350: 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63  n in session cac
4360: 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c  he, and must cal
4370: 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72  l SSL_SESSION_fr
4380: 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a  ee() when done..
4390: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
43e0: 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43  tic int.SessionC
43f0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
4400: 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73  , SSL_SESSION *s
4410: 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74  ession) {.    St
4420: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
4430: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
4440: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29  app_data((SSL *)
4450: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ssl);.    Tcl_In
4460: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
4470: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
4480: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
4490: 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  dPtr;.    const 
44a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
44b0: 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74  icket;.    const
44c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
44d0: 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20  session_id;.    
44e0: 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20  size_t len2;.   
44f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c   unsigned int ul
4500: 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  en;..    dprintf
4510: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
4520: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
4530: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
4540: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4550: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4560: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4570: 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55  se if (ssl == NU
4580: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
4590: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
45a0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
45b0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
45c0: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
45d0: 2c 20 63 68 61 6e 2c 20 73 65 73 73 69 6f 6e 20  , chan, session 
45e0: 69 64 2c 20 73 65 73 73 69 6f 6e 20 74 69 63 6b  id, session tick
45f0: 65 74 2c 20 61 6e 64 20 6c 69 66 65 74 69 6d 65  et, and lifetime
4600: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
4610: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4620: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4630: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
4640: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4650: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4660: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
4670: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
4680: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  on", -1));.    T
4690: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
46a0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
46b0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
46c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
46d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
46e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
46f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
4700: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  Session id */.  
4710: 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53    session_id = S
4720: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69  SL_SESSION_get_i
4730: 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  d(session, &ulen
4740: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4750: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4760: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4770: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
4780: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20  Obj(session_id, 
4790: 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29  (Tcl_Size) ulen)
47a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69  );..    /* Sessi
47b0: 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20  on ticket */.   
47c0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
47d0: 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e  0_ticket(session
47e0: 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32  , &ticket, &len2
47f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4800: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4810: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4820: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
4830: 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 6c  Obj(ticket, (Tcl
4840: 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a 0a  _Size) len2));..
4850: 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20      /* Lifetime 
4860: 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  - number of seco
4870: 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  nds */.    Tcl_L
4880: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4890: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
48a0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67  tr,..Tcl_NewLong
48b0: 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53  Obj((long) SSL_S
48c0: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65  ESSION_get_ticke
48d0: 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28  t_lifetime_hint(
48e0: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20  session)));..   
48f0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
4900: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
4910: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4920: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45  t(cmdPtr);.    E
4930: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
4940: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
4950: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  dPtr);.    Tcl_D
4960: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
4970: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74  tr);..    /* Ret
4980: 75 72 6e 20 30 20 66 6f 72 20 6e 6f 77 20 75 6e  urn 0 for now un
4990: 74 69 6c 20 73 65 73 73 69 6f 6e 20 68 61 6e 64  til session hand
49a0: 6c 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65 74 65  ling is complete
49b0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
49c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4a10: 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61  *. * ALPN Callba
4a20: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61  ck for Servers a
4a30: 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20  nd NPN Callback 
4a40: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20  for Clients --. 
4a50: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f  *. *.Perform pro
4a60: 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c  tocol (http/1.1,
4a70: 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73   h2, h3, etc.) s
4a80: 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65  election for the
4a90: 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e  . *.incoming con
4aa0: 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20  nection. Called 
4ab0: 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20  after Hello and 
4ac0: 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73  server callbacks
4ad0: 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27  .. *.Where 'out'
4ae0: 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f   is selected pro
4af0: 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69  tocol and 'in' i
4b00: 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72  s the peer adver
4b10: 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20  tised list.. *. 
4b20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
4b30: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
4b40: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
4b50: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
4b60: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
4b70: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
4b80: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
4b90: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65  ALPN protocol se
4ba0: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
4bb0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
4bc0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
4bd0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a  ERR_ALERT_FATAL:
4be0: 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76   There was no ov
4bf0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68  erlap between th
4c00: 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20  e client's. *.  
4c10: 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20    supplied list 
4c20: 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63  and the server c
4c30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
4c40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
4c50: 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a  l be aborted.. *
4c60: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4c70: 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74  NOACK: ALPN prot
4c80: 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65  ocol not selecte
4c90: 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65  d, e.g., because
4ca0: 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20   no ALPN. *.    
4cb0: 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f  protocols are co
4cc0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69  nfigured for thi
4cd0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  s connection. Th
4ce0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
4cf0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 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: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
4d50: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53 53 4c  ALPNCallback(SSL
4d60: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
4d70: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
4d80: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
4d90: 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20  *outlen,..const 
4da0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
4db0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  n, unsigned int 
4dc0: 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67  inlen, void *arg
4dd0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
4de0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
4df0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
4e00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
4e10: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
4e20: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
4e30: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
4e40: 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64  ode, res;..    d
4e50: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
4e60: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
4e70: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
4e80: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
4e90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4ea0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4eb0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74    /* Select prot
4ec0: 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  ocol */.    if (
4ed0: 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f  SSL_select_next_
4ee0: 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65 64 20  proto((unsigned 
4ef0: 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20 6f 75  char **) out, ou
4f00: 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e  tlen, statePtr->
4f10: 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72  protos, statePtr
4f20: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69  ->protos_len,..i
4f30: 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45  n, inlen) == OPE
4f40: 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41  NSSL_NPN_NEGOTIA
4f50: 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68  TED) {../* Match
4f60: 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d   found */..res =
4f70: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4f80: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
4f90: 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e  ../* OPENSSL_NPN
4fa0: 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f  _NO_OVERLAP = No
4fb0: 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65   overlap, so use
4fc0: 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d   first item from
4fd0: 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c   client protocol
4fe0: 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20   list */..res = 
4ff0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5000: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5010: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
5020: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
5030: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
5040: 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   res;.    }..   
5050: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
5060: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
5070: 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c  fn, chan, depth,
5080: 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c   cert info list,
5090: 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72   status, and err
50a0: 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  or args */.    c
50b0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
50c0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
50d0: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
50e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
50f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5100: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
5110: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20  ringObj("alpn", 
5120: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5130: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5140: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5150: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
5160: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
5170: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
5180: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
5190: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
51a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
51c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
51d0: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ((const char *) 
51e0: 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20  *out, -1));.    
51f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5200: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5210: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5220: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d  BooleanObj(res =
5230: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5240: 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  _OK));..    /* E
5250: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
5260: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
5270: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
5280: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
5290: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
52a0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
52b0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
52c0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
52d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
52e0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
52f0: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72  (code == 1) {..r
5300: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5310: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
5320: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
5330: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5340: 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20  _FATAL;.    }.  
5350: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5360: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
5370: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
5380: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41  --------. *. * A
53d0: 64 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f  dvertise Protoco
53e0: 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ls Callback for 
53f0: 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65  Next Protocol Ne
5400: 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20  gotiation (NPN) 
5410: 69 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d  in ServerHello -
5420: 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77  -. *. *.called w
5430: 68 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72  hen a TLS server
5440: 20 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66   needs a list of
5450: 20 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f   supported proto
5460: 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a  cols for Next. *
5470: 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69  .Protocol Negoti
5480: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ation.. *. * Res
5490: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
54a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
54b0: 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  :. *. * Return c
54c0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
54d0: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20  EXT_ERR_OK: NPN 
54e0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
54f0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
5500: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
5510: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5520: 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63  OACK: NPN protoc
5530: 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e  ol not selected.
5540: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5550: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a  continues.. *. *
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55  ---. */.#ifdef U
55b0: 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e  SE_NPN.static in
55c0: 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f  t.NPNCallback(co
55d0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  nst SSL *ssl, co
55e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
55f0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65  r **out, unsigne
5600: 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76  d int *outlen, v
5610: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
5620: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
5630: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a  = (State*)arg;..
5640: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5650: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
5660: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
5670: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
5680: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5690: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
56a0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72  }..    /* Set pr
56b0: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a  otocols list */.
56c0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
56d0: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c  ->protos != NULL
56e0: 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74  ) {..*out = stat
56f0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a  ePtr->protos;..*
5700: 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74  outlen = statePt
5710: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20  r->protos_len;. 
5720: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75     } else {..*ou
5730: 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c  t = NULL;..*outl
5740: 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20  en = 0;..return 
5750: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5760: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OACK;.    }.    
5770: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5780: 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  T_ERR_OK;.}.#end
5790: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
57e0: 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b  . * SNI Callback
57f0: 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a   for Servers --.
5800: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65   *. *.Perform se
5810: 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f  rver-side SNI ho
5820: 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e  stname selection
5830: 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67   after receiving
5840: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20   SNI extension. 
5850: 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c  *.in Client Hell
5860: 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  o. Called after 
5870: 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62  hello callback b
5880: 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63  ut before ALPN c
5890: 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
58a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
58b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
58c0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
58d0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
58e0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
58f0: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c  codes:. *.SSL_TL
5900: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49  SEXT_ERR_OK: SNI
5910: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63   hostname is acc
5920: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  epted. The conne
5930: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5940: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5950: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20  RR_ALERT_FATAL: 
5960: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
5970: 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68  not accepted. Th
5980: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09  e connection. *.
5990: 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20      is aborted. 
59a0: 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72  Default for aler
59b0: 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45  t is SSL_AD_UNRE
59c0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20  COGNIZED_NAME.. 
59d0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
59e0: 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20  _ALERT_WARNING: 
59f0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
5a00: 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61  not accepted, wa
5a10: 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20  rning alert. *. 
5a20: 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70     sent (not sup
5a30: 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e  ported in TLSv1.
5a40: 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  3). The connecti
5a50: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5a60: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
5a70: 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e  NOACK: SNI hostn
5a80: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70  ame is not accep
5a90: 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e  ted and not ackn
5aa0: 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20  owledged,. *.   
5ab0: 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73   e.g. if SNI has
5ac0: 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67   not been config
5ad0: 75 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  ured. The connec
5ae0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5af0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
5b40: 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62  tic int.SNICallb
5b50: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
5b60: 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20  sl, int *alert, 
5b70: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
5b80: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
5b90: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
5ba0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
5bb0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
5bc0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
5bd0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
5be0: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65      int code, re
5bf0: 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  s;.    const cha
5c00: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20  r *servername = 
5c10: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e  NULL;..    dprin
5c20: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
5c30: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
5c40: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
5c50: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
5c60: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5c70: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5c80: 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   Only works for 
5c90: 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c  TLS 1.2 and earl
5ca0: 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65  ier */.    serve
5cb0: 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f  rname = SSL_get_
5cc0: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
5cd0: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
5ce0: 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20  host_name);.    
5cf0: 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20  if (!servername 
5d00: 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d  || servername[0]
5d10: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74   == '\0') {..ret
5d20: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5d30: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5d40: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5d50: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
5d60: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
5d70: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5d80: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ERR_OK;.    }.. 
5d90: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
5da0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
5db0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20  h fn, chan, and 
5dc0: 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73  server name args
5dd0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
5de0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
5df0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
5e00: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5e10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5e20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
5e30: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5e40: 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20  ("sni", -1));.  
5e50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5e60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5e70: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
5e80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5e90: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
5ea0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
5eb0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
5ec0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5ed0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5ee0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
5ef0: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e  tringObj(servern
5f00: 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  ame , -1));..   
5f10: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
5f20: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
5f30: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5f40: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
5f50: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
5f60: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
5f70: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
5f80: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
5f90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5fa0: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09  ALERT_WARNING;..
5fb0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f  *alert = SSL_AD_
5fc0: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5fd0: 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72  E; /* Not suppor
5fe0: 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a  ted by TLS 1.3 *
5ff0: 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  /.    } else if 
6000: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72  (code == 1) {..r
6010: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
6020: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
6030: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
6040: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
6050: 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20  _FATAL;..*alert 
6060: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  = SSL_AD_UNRECOG
6070: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e  NIZED_NAME; /* N
6080: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
6090: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d  TLS 1.3 */.    }
60a0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
60b0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
60c0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
60d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 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 0a 20 2a 0a 20  -----------. *. 
6120: 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61  * ClientHello Ha
6130: 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b  ndshake Callback
6140: 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a   for Servers --.
6150: 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65   *. *.Used by se
6160: 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20  rver to examine 
6170: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
6180: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
6190: 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72   extension. *.pr
61a0: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c  ovided by the cl
61b0: 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ient in order to
61c0: 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f   select an appro
61d0: 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61  priate certifica
61e0: 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74  te to. *.present
61f0: 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72  , and make other
6200: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
6210: 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76  djustments relev
6220: 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76  ant to that serv
6230: 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69  er. *.name and i
6240: 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ts configuration
6250: 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20  . This includes 
6260: 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65  swapping out the
6270: 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53   associated. *.S
6280: 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20  SL_CTX pointer, 
6290: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65  modifying the se
62a0: 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70  rver's list of p
62b0: 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72  ermitted TLS ver
62c0: 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69  sions,. *.changi
62d0: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20  ng the server's 
62e0: 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72  cipher list in r
62f0: 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63  esponse to the c
6300: 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c  lient's cipher l
6310: 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c  ist, etc.. *.Cal
6320: 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61  led before SNI a
6330: 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b  nd ALPN callback
6340: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
6350: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
6360: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6370: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
6380: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
6390: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
63a0: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
63b0: 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70  ELLO_RETRY: susp
63c0: 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b  end the handshak
63d0: 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73  e, and the hands
63e0: 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69  hake function wi
63f0: 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  ll return immedi
6400: 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49  ately. *.SSL_CLI
6410: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a  ENT_HELLO_ERROR:
6420: 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e   failure, termin
6430: 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ate connection. 
6440: 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72  Set alert to err
6450: 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f  or code.. *.SSL_
6460: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6470: 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a  CESS: success. *
6480: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
64d0: 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62  c int.HelloCallb
64e0: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  ack(SSL *ssl, in
64f0: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
6500: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
6510: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
6520: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
6530: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6540: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
6550: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
6560: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
6570: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
6580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
6590: 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  vername;.    con
65a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
65b0: 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20   *p;.    size_t 
65c0: 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a  len, remaining;.
65d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
65e0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
65f0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
6600: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
6610: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
6620: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6630: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
6640: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f  e if (ssl == (co
6650: 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c  nst SSL *)NULL |
6660: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | arg == NULL) {
6670: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6680: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6690: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
66a0: 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  et names */.    
66b0: 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f  if (!SSL_client_
66c0: 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73  hello_get0_ext(s
66d0: 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f  sl, TLSEXT_TYPE_
66e0: 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c  server_name, &p,
66f0: 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20   &remaining) || 
6700: 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20  remaining <= 2) 
6710: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6720: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
6730: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
6740: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6750: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6760: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
6770: 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74  xtract the lengt
6780: 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  h of the supplie
6790: 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e  d list of names.
67a0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a   */.    len = (*
67b0: 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20  (p++) << 8);.   
67c0: 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a   len += *(p++);.
67d0: 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20      if (len + 2 
67e0: 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a  != remaining) {.
67f0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6800: 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45  SSLV3_ALERT_ILLE
6810: 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09  GAL_PARAMETER;..
6820: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6830: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6840: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6850: 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f  ng = len;..    /
6860: 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72  * The list in pr
6870: 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20  actice only has 
6880: 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74  a single element
6890: 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e  , so we only con
68a0: 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74 20  sider the first 
68b0: 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  one. */.    if (
68c0: 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c  remaining == 0 |
68d0: 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54  | *p++ != TLSEXT
68e0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
68f0: 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  ame) {..*alert =
6900: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6910: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6920: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6930: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6940: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  R;.    }.    rem
6950: 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f  aining--;..    /
6960: 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e  * Now we can fin
6970: 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68  ally pull out th
6980: 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69 74  e byte array wit
6990: 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73  h the actual hos
69a0: 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66  tname. */.    if
69b0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32   (remaining <= 2
69c0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
69d0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
69e0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
69f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6a00: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6a10: 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
6a20: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
6a30: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
6a40: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
6a50: 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b  2 > remaining) {
6a60: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6a70: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
6a80: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
6a90: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6aa0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6ab0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
6ac0: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76   = len;.    serv
6ad0: 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  ername = (const 
6ae0: 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f  char *)p;..    /
6af0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
6b00: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
6b10: 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76  , chan, and serv
6b20: 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a  er name args */.
6b30: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
6b40: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
6b50: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
6b60: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6b70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6b80: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
6b90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65  NewStringObj("he
6ba0: 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  llo", -1));.    
6bb0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6bc0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6bd0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
6be0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
6bf0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
6c00: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
6c10: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
6c20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6c30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6c40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
6c50: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d  ingObj(servernam
6c60: 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  e, (Tcl_Size) le
6c70: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  n));..    /* Eva
6c80: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
6c90: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
6ca0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
6cb0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
6cc0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
6cd0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
6ce0: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
6cf0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
6d00: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59  IENT_HELLO_RETRY
6d10: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6d20: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53  R_TLSV1_ALERT_US
6d30: 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20  ER_CANCELLED;.  
6d40: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64    } else if (cod
6d50: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d  e == 1) {..res =
6d60: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6d70: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
6d80: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
6d90: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6da0: 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d  ERROR;..*alert =
6db0: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6dc0: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6dd0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  R;.    }.    Tcl
6de0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
6df0: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  dPtr);.    retur
6e00: 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a  n res;.}.../****
6e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e20: 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20  /./* Commands   
6e30: 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6e50: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6ea0: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d  CiphersObjCmd --
6eb0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
6ec0: 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68  ciphers. *. *.Th
6ed0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
6ee0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
6ef0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70  ss the "tls::cip
6f00: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  hers" command. *
6f10: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
6f20: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65  le ciphers, base
6f30: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20  d upon protocol 
6f40: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20  selected.. *. * 
6f50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
6f60: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
6f70: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
6f80: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
6f90: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65  onstructs and de
6fa0: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65  stroys SSL conte
6fb0: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  -. */.static con
7010: 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f  st char *protoco
7020: 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 73 73  ls[] = {.    "ss
7030: 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c  l2", "ssl3", "tl
7040: 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22  s1", "tls1.1", "
7050: 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33  tls1.2", "tls1.3
7060: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20  ", NULL.};.enum 
7070: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54  protocol {.    T
7080: 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c  LS_SSL2, TLS_SSL
7090: 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53  3, TLS_TLS1, TLS
70a0: 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53  _TLS1_1, TLS_TLS
70b0: 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c  1_2, TLS_TLS1_3,
70c0: 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74   TLS_NONE.};..st
70d0: 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73  atic int.Ciphers
70e0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
70f0: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
7100: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
7110: 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20  interp,.    int 
7120: 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62  objc,.    Tcl_Ob
7130: 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j.*const objv[])
7140: 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .{.    Tcl_Obj *
7150: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  objPtr = NULL;. 
7160: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
7170: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20  = NULL;.    SSL 
7180: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ssl = NULL;.   
7190: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49   STACK_OF(SSL_CI
71a0: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63  PHER) *sk;.    c
71b0: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b  har buf[BUFSIZ];
71c0: 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20  .    int index, 
71d0: 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65  verbose = 0, use
71e0: 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a  _supported = 0;.
71f0: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45      const SSL_ME
7200: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20  THOD *method;.. 
7210: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
7220: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28  ed");..    if ((
7230: 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62  objc < 2) || (ob
7240: 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f  jc > 4)) {..Tcl_
7250: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
7260: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70  erp, 1, objv, "p
7270: 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65  rotocol ?verbose
7280: 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b  ? ?supported?");
7290: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
72a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
72b0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
72c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
72d0: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73  jv[1], protocols
72e0: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c  , "protocol", 0,
72f0: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f   &index) != TCL_
7300: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7310: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7320: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32     if ((objc > 2
7330: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
7340: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7350: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72  p, objv[2], &ver
7360: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  bose) != TCL_OK)
7370: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
7380: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7390: 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26  if ((objc > 3) &
73a0: 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  & Tcl_GetBoolean
73b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
73c0: 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75  objv[3], &use_su
73d0: 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f  pported) != TCL_
73e0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
73f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7400: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
7410: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74  ror();..    swit
7420: 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63  ch ((enum protoc
7430: 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73  ol)index) {..cas
7440: 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20  e TLS_SSL2:.#if 
7450: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
7460: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
7470: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
7480: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
7490: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
74a0: 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41  SSL2)..    Tcl_A
74b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
74c0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
74d0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
74e0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
74f0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
7500: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7510: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7520: 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76     method = SSLv
7530: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  2_method(); brea
7540: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
7550: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65  TLS_SSL3:.#if de
7560: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
7570: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7580: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  L_NO_SSL3) || de
7590: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
75a0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20  _SSL3_METHOD).. 
75b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
75c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
75d0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
75e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
75f0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7600: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  *)NULL);..    re
7610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7620: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f  #else..    metho
7630: 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64  d = SSLv3_method
7640: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7650: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7660: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
7670: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7680: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7690: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
76a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
76b0: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41  THOD)..    Tcl_A
76c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
76d0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
76e0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
76f0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
7700: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
7710: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7720: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7730: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76     method = TLSv
7740: 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  1_method(); brea
7750: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
7760: 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20  TLS_TLS1_1:.#if 
7770: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7780: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
7790: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
77a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
77b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
77c0: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41  THOD)..    Tcl_A
77d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
77e0: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
77f0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
7800: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
7810: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
7820: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7830: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7840: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76     method = TLSv
7850: 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  1_1_method(); br
7860: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
7870: 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69  e TLS_TLS1_2:.#i
7880: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
7890: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
78a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
78b0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
78c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f  ENSSL_NO_TLS1_2_
78d0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
78e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
78f0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
7900: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7910: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7920: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
7930: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7940: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7950: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
7960: 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20  Sv1_2_method(); 
7970: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
7980: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a  ase TLS_TLS1_3:.
7990: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
79a0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_3) || define
79b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
79c0: 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  1_3)..    Tcl_Ap
79d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
79e0: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
79f0: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7a00: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7a10: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
7a20: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7a30: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7a40: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d    method = TLS_m
7a50: 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53  ethod();..    SS
7a60: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
7a70: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
7a80: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
7a90: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  ;..    SSL_CTX_s
7aa0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
7ab0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
7ac0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20  _VERSION);..    
7ad0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64  break;.#endif..d
7ae0: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74  efault:..    met
7af0: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64  hod = TLS_method
7b00: 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  ();..    break;.
7b10: 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d      }..    ctx =
7b20: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74   SSL_CTX_new(met
7b30: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74  hod);.    if (ct
7b40: 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  x == NULL) {..Tc
7b50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7b60: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52  nterp, GET_ERR_R
7b70: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
7b80: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
7b90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7ba0: 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f  ..    ssl = SSL_
7bb0: 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66  new(ctx);.    if
7bc0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ssl == NULL) {
7bd0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7be0: 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45  lt(interp, GET_E
7bf0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
7c00: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c  ar *)NULL);..SSL
7c10: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
7c20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7c30: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
7c40: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72   Use list and or
7c50: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20  der as would be 
7c60: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74  sent in a Client
7c70: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61  Hello or all ava
7c80: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a  ilable ciphers *
7c90: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75  /.    if (use_su
7ca0: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d  pported) {..sk =
7cb0: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72   SSL_get1_suppor
7cc0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29  ted_ciphers(ssl)
7cd0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
7ce0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70  sk = SSL_get_cip
7cf0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
7d00: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20  ..    if (sk != 
7d10: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65  NULL) {..if (!ve
7d20: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f  rbose) {..    co
7d30: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20  nst char *cp;.. 
7d40: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7d50: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7d60: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7d70: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7d80: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7d90: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
7da0: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
7db0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
7dc0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
7dd0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
7de0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
7df0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7e00: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7e10: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7e20: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7e30: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7e40: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7e50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7e60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7e70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70  _NewStringObj(cp
7e80: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  , -1));..    }..
7e90: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f  .} else {..    o
7ea0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
7eb0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a  tringObj("",0);.
7ec0: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
7ed0: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
7ee0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
7ef0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
7f00: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
7f10: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
7f20: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
7f30: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
7f40: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74  inue;..../* text
7f50: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
7f60: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
7f70: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  ...if (SSL_CIPHE
7f80: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c  R_description(c,
7f90: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
7fa0: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) != NULL) {...
7fb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
7fc0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c  Obj(objPtr, buf,
7fd0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c   (Tcl_Size) strl
7fe0: 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c  en(buf));...} el
7ff0: 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41  se {...    Tcl_A
8000: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74  ppendToObj(objPt
8010: 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20  r, "UNKNOWN\n", 
8020: 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  8);...}..    }..
8030: 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70 6f  }..if (use_suppo
8040: 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f  rted) {..    sk_
8050: 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65 28  SSL_CIPHER_free(
8060: 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  sk);..}.    }.  
8070: 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b    SSL_free(ssl);
8080: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
8090: 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c  e(ctx);..    Tcl
80a0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
80b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
80c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
80d0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8120: 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  *. * ProtocolsOb
8130: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61  jCmd -- list ava
8140: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
8150: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
8160: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
8170: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
8180: 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22  "tls::protocols"
8190: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
81a0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72  ist available pr
81b0: 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52  otocols.. *. * R
81c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
81d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
81e0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
81f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f  e effects:. *.no
8200: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8250: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74  .static int.Prot
8260: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 0a 20 20 20  ocolsObjCmd(.   
8270: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
8280: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
8290: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20  erp *interp,.   
82a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54   int objc,.    T
82b0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
82c0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
82d0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20  Obj *objPtr;..  
82e0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
82f0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
8300: 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f  jc != 1) {..Tcl_
8310: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8320: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
8330: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
8340: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8350: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
8360: 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ();..    objPtr 
8370: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
8380: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20  (0, NULL);..#if 
8390: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
83a0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
83b0: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
83c0: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
83d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
83e0: 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c  _SSL2).    Tcl_L
83f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8410: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8420: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8430: 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a  LS_SSL2], -1));.
8440: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8450: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
8460: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8470: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
8480: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8490: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
84a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
84b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
84c0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
84d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
84e0: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c  ocols[TLS_SSL3],
84f0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8500: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8510: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
8520: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
8530: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8540: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
8550: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
8560: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8570: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8580: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8590: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
85a0: 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  _TLS1], -1));.#e
85b0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
85c0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
85d0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
85e0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
85f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8600: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
8610: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
8620: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8630: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8640: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8650: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
8660: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_1], -1));.#en
8670: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8680: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
8690: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
86a0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
86b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
86c0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
86d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
86e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
86f0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
8700: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
8710: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
8720: 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_2], -1));.#end
8730: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
8740: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
8750: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8760: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63  O_TLS1_3).    Tc
8770: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8780: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8790: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
87a0: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
87b0: 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d  s[TLS_TLS1_3], -
87c0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  1));.#endif..   
87d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
87e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
87f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8800: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8850: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61  --. *. * Handsha
8860: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  keObjCmd --. *. 
8870: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  *.This command i
8880: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
8890: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e   whether the han
88a0: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65  dshake is comple
88b0: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a  te. *.or not.. *
88c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
88d0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
88e0: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68  esult. 1 means h
88f0: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74  andshake complet
8900: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69  e, 0 means pendi
8910: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ng.. *. * Side e
8920: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66  ffects:. *.May f
8930: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61  orce SSL negotia
8940: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61  tion to take pla
8950: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ce.. *. *-------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
89a0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  ..static int Han
89b0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 0a 20 20  dshakeObjCmd(.  
89c0: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
89d0: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
89e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
89f0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20    int objc,.    
8a00: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
8a10: 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c  bjv[]).{.    Tcl
8a20: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20  _Channel chan;  
8a30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61        /* The cha
8a40: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
8a50: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74  de on. */.    St
8a60: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20  ate *statePtr;  
8a70: 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20        /* client 
8a80: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f  state for ssl so
8a90: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  cket */.    cons
8aa0: 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d  t char *errStr =
8ab0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
8ac0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  et = 1;.    int 
8ad0: 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  err = 0;..    dp
8ae0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
8af0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
8b00: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
8b10: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8b20: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
8b30: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
8b40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8b50: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
8b60: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e  ror();..    chan
8b70: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
8b80: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
8b90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
8ba0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
8bb0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
8bc0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
8bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8be0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8bf0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8c00: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8c10: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8c20: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8c30: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
8c40: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
8c50: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
8c60: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
8c70: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
8c80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8c90: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
8ca0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
8cb0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
8cc0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
8cd0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
8ce0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c  ar *)NULL);..Tcl
8cf0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
8d00: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
8d10: 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e  NDSHAKE", "CHANN
8d20: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
8d30: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
8d40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8d50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
8d60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
8d70: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
8d80: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
8d90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8da0: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
8db0: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20  ForConnect");.  
8dc0: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74    ret = Tls_Wait
8dd0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
8de0: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20  Ptr, &err, 1);. 
8df0: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f     dprintf("Tls_
8e00: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72  WaitForConnect r
8e10: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65  eturned: %i", re
8e20: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74  t);..    if (ret
8e30: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50   < 0 && ((stateP
8e40: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
8e50: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65  TCL_ASYNC) && (e
8e60: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20  rr == EAGAIN))) 
8e70: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e  {..dprintf("Asyn
8e80: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20  c set and err = 
8e90: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d  EAGAIN");..ret =
8ea0: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   0;.    } else i
8eb0: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c  f (ret < 0) {..l
8ec0: 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72  ong result;..err
8ed0: 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  Str = statePtr->
8ee0: 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52  err;..Tcl_ResetR
8ef0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09  esult(interp);..
8f00: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72  Tcl_SetErrno(err
8f10: 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72  );...if (!errStr
8f20: 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20   || (*errStr == 
8f30: 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74  0)) {..    errSt
8f40: 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72  r = Tcl_PosixErr
8f50: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a  or(interp);..}..
8f60: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8f70: 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73  t(interp, "hands
8f80: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  hake failed: ", 
8f90: 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29  errStr, (char *)
8fa0: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73  NULL);..if ((res
8fb0: 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65  ult = SSL_get_ve
8fc0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
8fd0: 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58  ePtr->ssl)) != X
8fe0: 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20  509_V_OK) {..   
8ff0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9000: 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20  t(interp, " due 
9010: 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72  to \"", X509_ver
9020: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
9030: 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22  tring(result), "
9040: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  \"", (char *)NUL
9050: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45  L);..}..Tcl_SetE
9060: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
9070: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
9080: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
9090: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 64  char *)NULL);..d
90a0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
90b0: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68  g TCL_ERROR with
90c0: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65   handshake faile
90d0: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b  d: %s", errStr);
90e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
90f0: 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OR;.    } else {
9100: 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20  ..if (err != 0) 
9110: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
9120: 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74  Got an error wit
9130: 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61  h a completed ha
9140: 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25  ndshake: err = %
9150: 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65  i", err);..}..re
9160: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
9170: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
9180: 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68  ning TCL_OK with
9190: 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72   data \"%i\"", r
91a0: 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  et);.    Tcl_Set
91b0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
91c0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
91d0: 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ret));.    retur
91e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
91f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70  ------. *. * Imp
9240: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
9250: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
9260: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
9270: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c  process the "ssl
9280: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09  " command. *. *.
9290: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20  The ssl command 
92a0: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20  pushes SSL over 
92b0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74  a (newly connect
92c0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20  ed) tcp socket. 
92d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
92e0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
92f0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
9300: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
9310: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
9320: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
9330: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
9390: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 0a  t.ImportObjCmd(.
93a0: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76      TCL_UNUSED(v
93b0: 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f  oid *),.    Tcl_
93c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
93d0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20      int objc,.  
93e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74    Tcl_Obj *const
93f0: 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54   objv[]).{.    T
9400: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
9410: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
9420: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
9430: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
9440: 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
9450: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
9460: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
9470: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09    SSL_CTX *ctx..
9480: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9490: 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 4e  Obj *script..= N
94a0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
94b0: 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e 55   *password..= NU
94c0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
94d0: 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *vcmd..= NULL;. 
94e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75     Tcl_DString u
94f0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
9500: 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61  lation, upperCha
9510: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70  nnelBlocking, up
9520: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
9530: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ng, upperChannel
9540: 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74  EOFChar;.    int
9550: 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69   idx;.    Tcl_Si
9560: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  ze len;.    int 
9570: 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43  flags...= TLS_TC
9580: 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20  L_INIT;.    int 
9590: 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a  server...= 0;./*
95a0: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   is connection i
95b0: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f  ncoming or outgo
95c0: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72  ing? */.    char
95d0: 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c   *keyfile..= NUL
95e0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72  L;.    char *cer
95f0: 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20  tfile..= NULL;. 
9600: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9610: 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20   *key..= NULL;. 
9620: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f     Tcl_Size key_
9630: 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e  len..= 0;.    un
9640: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
9650: 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  t..= NULL;.    T
9660: 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e  cl_Size cert_len
9670: 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  ..= 0;.    char 
9680: 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c  *ciphers..= NULL
9690: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
96a0: 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c  ersuites..= NULL
96b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69  ;.    char *CAfi
96c0: 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  le..= NULL;.    
96d0: 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20  char *CApath..= 
96e0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
96f0: 43 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c 3b  CAstore..= NULL;
9700: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
9710: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ams..= NULL;.   
9720: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d   char *model...=
9730: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9740: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e  *servername..= N
9750: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
9760: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
9770: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20   Indication */. 
9780: 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e     char *session
9790: 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  _id..= NULL;.   
97a0: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09   Tcl_Obj *alpn..
97b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
97c0: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
97d0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
97e0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
97f0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
9800: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
9810: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
9820: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
9830: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
9840: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
9850: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
9860: 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20  shake = 0;..    
9870: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
9880: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
9890: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
98a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
98b0: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20  LS1).    tls1 = 
98c0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
98d0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
98e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
98f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
9900: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23     tls1_1 = 0;.#
9910: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
9920: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
9930: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9940: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74  NO_TLS1_2).    t
9950: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_2 = 0;.#endi
9960: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
9970: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
9980: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9990: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_3).    tls1_
99a0: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  3 = 0;.#endif.. 
99b0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
99c0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
99d0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
99e0: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f  objv, "channel ?
99f0: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74  options?");..ret
9a00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9a10: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
9a20: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
9a30: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9a40: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
9a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
9a60: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
9a70: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
9a80: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
9a90: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
9aa0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9ab0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
9ac0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
9ad0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
9ae0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
9af0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
9b00: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f  l(chan);..    fo
9b10: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20  r (idx = 2; idx 
9b20: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b  < objc; idx++) {
9b30: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63  ..char *opt = Tc
9b40: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
9b50: 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70  [idx]);...if (op
9b60: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20  t[0] != '-')..  
9b70: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42    break;...OPTOB
9b80: 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29  J("-alpn", alpn)
9b90: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69  ;..OPTSTR("-cadi
9ba0: 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 4f 50  r", CApath);..OP
9bb0: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20  TSTR("-cafile", 
9bc0: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  CAfile);..OPTSTR
9bd0: 28 22 2d 63 61 73 74 6f 72 65 22 2c 20 43 41 73  ("-castore", CAs
9be0: 74 6f 72 65 29 3b 0a 09 4f 50 54 42 59 54 45 28  tore);..OPTBYTE(
9bf0: 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63  "-cert", cert, c
9c00: 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54  ert_len);..OPTST
9c10: 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63  R("-certfile", c
9c20: 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  ertfile);..OPTST
9c30: 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70  R("-cipher", cip
9c40: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  hers);..OPTSTR("
9c50: 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68 65  -ciphers", ciphe
9c60: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  rs);..OPTSTR("-c
9c70: 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63 69  iphersuites", ci
9c80: 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50  phersuites);..OP
9c90: 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c  TOBJ("-command",
9ca0: 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54   script);..OPTST
9cb0: 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44  R("-dhparams", D
9cc0: 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59  Hparams);..OPTBY
9cd0: 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20  TE("-key", key, 
9ce0: 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54  key_len);..OPTST
9cf0: 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65  R("-keyfile", ke
9d00: 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  yfile);..OPTSTR(
9d10: 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29  "-model", model)
9d20: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73  ;..OPTOBJ("-pass
9d30: 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29  word", password)
9d40: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73  ;..OPTBOOL("-pos
9d50: 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f  t_handshake", po
9d60: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09  st_handshake);..
9d70: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73  OPTBOOL("-reques
9d80: 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f  t", request);..O
9d90: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65  PTBOOL("-require
9da0: 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50  ", require);..OP
9db0: 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f  TINT("-security_
9dc0: 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a  level", level);.
9dd0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65  .OPTBOOL("-serve
9de0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50  r", server);..OP
9df0: 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d  TSTR("-servernam
9e00: 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b  e", servername);
9e10: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69  ..OPTSTR("-sessi
9e20: 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f  on_id", session_
9e30: 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  id);..OPTBOOL("-
9e40: 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f  ssl2", ssl2);..O
9e50: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20  PTBOOL("-ssl3", 
9e60: 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl3);..OPTBOOL(
9e70: 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a  "-tls1", tls1);.
9e80: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
9e90: 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50  1", tls1_1);..OP
9ea0: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c  TBOOL("-tls1.2",
9eb0: 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f   tls1_2);..OPTBO
9ec0: 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c  OL("-tls1.3", tl
9ed0: 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  s1_3);..OPTOBJ("
9ee0: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
9ef0: 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42  ", vcmd);..OPTOB
9f00: 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29  J("-vcmd", vcmd)
9f10: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69  ;...OPTBAD("opti
9f20: 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61  on", "-alpn, -ca
9f30: 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63  dir, -cafile, -c
9f40: 61 73 74 6f 72 65 2c 20 2d 63 65 72 74 2c 20 2d  astore, -cert, -
9f50: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65  certfile, -ciphe
9f60: 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73  r, -ciphersuites
9f70: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70  , -command, -dhp
9f80: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65  arams, -key, -ke
9f90: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d  yfile, -model, -
9fa0: 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f  password, -post_
9fb0: 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75  handshake, -requ
9fc0: 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d  est, -require, -
9fd0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20  security_level, 
9fe0: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72  -server, -server
9ff0: 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69  name, -session_i
a000: 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c  d, -ssl2, -ssl3,
a010: 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c   -tls1, -tls1.1,
a020: 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e   -tls1.2, -tls1.
a030: 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63  3, or -validatec
a040: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75  ommand");...retu
a050: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a060: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75    }.    if (requ
a070: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20  est)..verify |= 
a080: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
a090: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52  T_ONCE | SSL_VER
a0a0: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66  IFY_PEER;.    if
a0b0: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71   (request && req
a0c0: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20  uire).verify |= 
a0d0: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f  SSL_VERIFY_FAIL_
a0e0: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b  IF_NO_PEER_CERT;
a0f0: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74  .    if (request
a100: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
a110: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  ke).verify |= SS
a120: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41  L_VERIFY_POST_HA
a130: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20  NDSHAKE;.    if 
a140: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76  (verify == 0)..v
a150: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49  erify = SSL_VERI
a160: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72  FY_NONE;..    pr
a170: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54  oto |= (ssl2 ? T
a180: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20  LS_PROTO_SSL2 : 
a190: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
a1a0: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f   (ssl3 ? TLS_PRO
a1b0: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20  TO_SSL3 : 0);.  
a1c0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a1d0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
a1e0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
a1f0: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54  o |= (tls1_1 ? T
a200: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20  LS_PROTO_TLS1_1 
a210: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a220: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53  |= (tls1_2 ? TLS
a230: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20  _PROTO_TLS1_2 : 
a240: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
a250: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50   (tls1_3 ? TLS_P
a260: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29  ROTO_TLS1_3 : 0)
a270: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20  ;..    /* reset 
a280: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b  to NULL if blank
a290: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64   string provided
a2a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74   */.    if (cert
a2b0: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20   && !*cert)..   
a2c0: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20       cert.      
a2d0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a2e0: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09   (key && !*key).
a2f0: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20  .        key.   
a300: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a310: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26   if (certfile &&
a320: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20   !*certfile)    
a330: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20       certfile.= 
a340: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65  NULL;.    if (ke
a350: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69  yfile && !*keyfi
a360: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20  le)..keyfile.   
a370: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a380: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20   if (ciphers && 
a390: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20  !*ciphers).     
a3a0: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20     ciphers.     
a3b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a3c0: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20  f (ciphersuites 
a3d0: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65  && !*ciphersuite
a3e0: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20  s) ciphersuites 
a3f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a400: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43  f (CAfile && !*C
a410: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43  Afile).        C
a420: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  Afile.        = 
a430: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
a440: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68  path && !*CApath
a450: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68  ).        CApath
a460: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a470: 0a 20 20 20 20 69 66 20 28 43 41 73 74 6f 72 65  .    if (CAstore
a480: 20 26 26 20 21 2a 43 41 73 74 6f 72 65 29 09 20   && !*CAstore). 
a490: 20 20 20 20 20 20 20 43 41 73 74 6f 72 65 09 20         CAstore. 
a4a0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a4b0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20     if (DHparams 
a4c0: 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20  && !*DHparams). 
a4d0: 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20         DHparams 
a4e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a         = NULL;..
a4f0: 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73      /* new SSL s
a500: 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74  tate */.    stat
a510: 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a  ePtr..= (State *
a520: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67  ) ckalloc((unsig
a530: 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74  ned) sizeof(Stat
a540: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e));.    memset(
a550: 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a  statePtr, 0, siz
a560: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20  eof(State));..  
a570: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67    statePtr->flag
a580: 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73  s.= flags;.    s
a590: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09  tatePtr->interp.
a5a0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74  = interp;.    st
a5b0: 61 74 65 50 74 72 2d 3e 77 61 6e 74 09 3d 20 30  atePtr->want.= 0
a5c0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a5d0: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b  vflags.= verify;
a5e0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65  .    statePtr->e
a5f0: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a  rr.= "";..    /*
a600: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74   allocate script
a610: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69   */.    if (scri
a620: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  pt) {..(void) Tc
a630: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a640: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29  bj(script, &len)
a650: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
a660: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c     statePtr->cal
a670: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a  lback = script;.
a680: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a690: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a6a0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20  callback);..}.  
a6b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
a6c0: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f  cate password */
a6d0: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72  .    if (passwor
a6e0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a6f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a700: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e  j(password, &len
a710: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a720: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61      statePtr->pa
a730: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72  ssword = passwor
a740: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a750: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a760: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d  r->password);..}
a770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
a780: 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65  llocate validate
a790: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
a7a0: 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f  if (vcmd) {..(vo
a7b0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
a7c0: 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26  gFromObj(vcmd, &
a7d0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
a7e0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
a7f0: 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20  >vcmd = vcmd;.. 
a800: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a810: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63  unt(statePtr->vc
a820: 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  md);..}.    }.. 
a830: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20     if (model != 
a840: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64  NULL) {..int mod
a850: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22  e;../* Get the "
a860: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a  model" context *
a870: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a880: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
a890: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a   model, &mode);.
a8a0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63  .if (chan == (Tc
a8b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
a8c0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
a8d0: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
a8e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
a8f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a900: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
a910: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
a920: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
a930: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
a940: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a950: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
a960: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
a970: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
a980: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
a990: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
a9a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a9b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
a9c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
a9d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
a9e0: 29 2c 0a 09 09 20 20 20 20 22 5c 22 3a 20 6e 6f  ),...    "\": no
a9f0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
aa00: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
aa10: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
aa20: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
aa30: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
aa40: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
aa50: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  LID", (char *)NU
aa60: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
aa70: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
aa80: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
aa90: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aaa0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d  ERROR;..}..ctx =
aab0: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47   ((State *)Tcl_G
aac0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
aad0: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74  eData(chan))->ct
aae0: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  x;.    } else {.
aaf0: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f  .if ((ctx = CTX_
ab00: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73  Init(statePtr, s
ab10: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  erver, proto, ke
ab20: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c  yfile, certfile,
ab30: 20 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f   key, cert, key_
ab40: 6c 65 6e 2c 0a 09 09 63 65 72 74 5f 6c 65 6e 2c  len,...cert_len,
ab50: 20 43 41 70 61 74 68 2c 20 43 41 73 74 6f 72 65   CApath, CAstore
ab60: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72  , CAfile, cipher
ab70: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c  s, ciphersuites,
ab80: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73   level, DHparams
ab90: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  )) == NULL) {.. 
aba0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
abb0: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
abc0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
abd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
abe0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
abf0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
ac00: 78 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73 65  x;..    /* Prese
ac10: 72 76 65 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66  rve channel conf
ac20: 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  ig */.    Tcl_DS
ac30: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
ac40: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
ac50: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
ac60: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
ac70: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
ac80: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ac90: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
aca0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
acb0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
acc0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
acd0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
ace0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
acf0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
ad00: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65  -eofchar", &uppe
ad10: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
ad20: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
ad30: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ad40: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64  p, chan, "-encod
ad50: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
ad60: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
ad70: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
ad80: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
ad90: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
ada0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
adb0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
adc0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
add0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
ade0: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
adf0: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
ae00: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20  lBlocking);..   
ae10: 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 63   /* Ensure the c
ae20: 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20  hannel works in 
ae30: 62 69 6e 61 72 79 20 6d 6f 64 65 20 28 66 6f 72  binary mode (for
ae40: 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20   the encryption 
ae50: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
ae60: 64 20 75 70 29 2e 20 2a 2f 0a 20 20 20 20 54 63  d up). */.    Tc
ae70: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
ae80: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
ae90: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
aea0: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20   "binary");.    
aeb0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
aec0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
aed0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
aee0: 22 74 72 75 65 22 29 3b 0a 0a 20 20 20 20 2f 2a  "true");..    /*
aef0: 20 43 72 65 61 74 65 20 73 74 61 63 6b 65 64 20   Create stacked 
af00: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 64  channel */.    d
af10: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e  printf("Consumin
af20: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73  g Tcl channel %s
af30: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
af40: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20  lName(chan));.  
af50: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
af60: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e   = Tcl_StackChan
af70: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f  nel(interp, Tls_
af80: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 73  ChannelType(), s
af90: 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45  tatePtr, (TCL_RE
afa0: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49  ADABLE | TCL_WRI
afb0: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20  TABLE), chan);. 
afc0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61     dprintf("Crea
afd0: 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  ted channel name
afe0: 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  d %s", Tcl_GetCh
aff0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
b000: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20  tr->self));.    
b010: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65  if (statePtr->se
b020: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
b030: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a  el) NULL) {../*.
b040: 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63  . * No use of Tc
b050: 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  l_EventuallyFree
b060: 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73   because no poss
b070: 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76  ible Tcl_Preserv
b080: 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65  e... */..Tls_Fre
b090: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
b0a0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b0b0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b0c0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
b0d0: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 63 6c 5f  nslation);..Tcl_
b0e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b0f0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
b100: 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  g);..Tcl_DString
b110: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b120: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 54 63 6c  elEOFChar);..Tcl
b130: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b140: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
b150: 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ng);..return TCL
b160: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
b170: 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 63 68     /* Restore ch
b180: 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a  annel config */.
b190: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b1a0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b1b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b1c0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
b1d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
b1e0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
b1f0: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20  ranslation));.  
b200: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b210: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b220: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b230: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f  -encoding", Tcl_
b240: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b250: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b260: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ng));.    Tcl_Se
b270: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b280: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b290: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72  >self, "-eofchar
b2a0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
b2b0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
b2c0: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20  lEOFChar));.    
b2d0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
b2e0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
b2f0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62  tePtr->self, "-b
b300: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53  locking", Tcl_DS
b310: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
b320: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
b330: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ));.    Tcl_DStr
b340: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b350: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b360: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b370: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b380: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
b390: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
b3a0: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b3b0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
b3c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b3d0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
b3e0: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ing);..    /*.  
b3f0: 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c     * SSL Initial
b400: 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a  ization.     */.
b410: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73      statePtr->ss
b420: 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74  l = SSL_new(stat
b430: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20  ePtr->ctx);.    
b440: 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73  if (!statePtr->s
b450: 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69  sl) {../* SSL li
b460: 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09  brary error */..
b470: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b480: 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e  (interp, "couldn
b490: 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c  't construct ssl
b4a0: 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54   session: ", GET
b4b0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b4c0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54  char *)NULL);..T
b4d0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b4e0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b4f0: 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c  IMPORT", "INIT",
b500: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b510: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46   *)NULL);..Tls_F
b520: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
b530: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  pe *) statePtr);
b540: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b550: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
b560: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65  * Set host serve
b570: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66  r name */.    if
b580: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a   (servername) {.
b590: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72  ./* Sets the ser
b5a0: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74  ver name indicat
b5b0: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69  ion (SNI) in Cli
b5c0: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69  entHello extensi
b5d0: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46  on */../* Per RF
b5e0: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65  C 6066, hostname
b5f0: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f   is a ASCII enco
b600: 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75  ded string, thou
b610: 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73  gh RFC 4366 says
b620: 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28   UTF-8. */..if (
b630: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f  !SSL_set_tlsext_
b640: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50  host_name(stateP
b650: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
b660: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29  ame) && require)
b670: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
b680: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b690: 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73   "Set SNI extens
b6a0: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ion failed: ", G
b6b0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
b6c0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
b6d0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
b6e0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
b6f0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
b700: 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  SNI", "FAILED", 
b710: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
b720: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
b730: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
b740: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b750: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b760: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73  ..}.../* Set hos
b770: 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63  tname for peer c
b780: 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e  ertificate hostn
b790: 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ame verification
b7a0: 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20   in clients...  
b7b0: 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73   Don't use SSL_s
b7c0: 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69  et1_host since i
b7d0: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e  t has limitation
b7e0: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  s. */..if (!SSL_
b7f0: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50  add1_host(stateP
b800: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
b810: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ame)) {..    Tcl
b820: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b830: 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68  terp, "Set DNS h
b840: 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20  ostname failed: 
b850: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
b860: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
b870: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
b880: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b890: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b8a0: 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22  ", "HOSTNAME", "
b8b0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
b8c0: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73  )NULL);..    Tls
b8d0: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
b8e0: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72  type *) statePtr
b8f0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b900: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
b910: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d   }..    /* Resum
b920: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  e session id */.
b930: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f      if (session_
b940: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73  id && strlen(ses
b950: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f  sion_id) <= SSL_
b960: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47  MAX_SID_CTX_LENG
b970: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65  TH) {../* SSL_se
b980: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09  t_session() */..
b990: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e  if (!SSL_SESSION
b9a0: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74  _set1_id_context
b9b0: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e  (SSL_get_session
b9c0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
b9d0: 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ...(const unsign
b9e0: 65 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 69  ed char *) sessi
b9f0: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64  on_id, (unsigned
ba00: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73   int) strlen(ses
ba10: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20  sion_id))) {..  
ba20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ba30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75  lt(interp, "Resu
ba40: 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65  me session faile
ba50: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
ba60: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ba70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
ba80: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
ba90: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
baa0: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c  ORT", "SESSION",
bab0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
bac0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54   *)NULL);..    T
bad0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
bae0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
baf0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
bb00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
bb10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61     }..    /* Ena
bb20: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d  ble Application-
bb30: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e  Layer Protocol N
bb40: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d  egotiation. Exam
bb50: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31  ples are: http/1
bb60: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68  .0,..http/1.1, h
bb70: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70  2, h3, ftp, imap
bb80: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69  , pop3, xmpp-cli
bb90: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72  ent, xmpp-server
bba0: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63  , mqtt, irc, etc
bbb0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70  . */.    if (alp
bbc0: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74  n) {../* Convert
bbd0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f   a TCL list into
bbe0: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74   a protocol-list
bbf0: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20   in wire-format 
bc00: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  */..unsigned cha
bc10: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09  r *protos, *p;..
bc20: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f  unsigned int pro
bc30: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63  tos_len = 0;..Tc
bc40: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09  l_Size cnt, i;..
bc50: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20  int j;..Tcl_Obj 
bc60: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63  **list;...if (Tc
bc70: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
bc80: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70  ents(interp, alp
bc90: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20  n, &cnt, &list) 
bca0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
bcb0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
bcc0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
bcd0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
bce0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bcf0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
bd00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
bd10: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
bd20: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
bd30: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
bd40: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
bd50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
bd60: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
bd70: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
bd80: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
bd90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bda0: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
bdb0: 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c  ocol names too l
bdc0: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ong", (char *)NU
bdd0: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72  LL);...Tcl_SetEr
bde0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
bdf0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
be00: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
be10: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
be20: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 74 6c  ;...Tls_Free((tl
be30: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
be40: 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75  tatePtr);...retu
be50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
be60: 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73     }..    protos
be70: 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74  _len += 1 + (int
be80: 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42  ) len;..}.../* B
be90: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74  uild the complet
bea0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
beb0: 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61  */..protos = cka
bec0: 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29  lloc(protos_len)
bed0: 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c  ;../* protocol-l
bee0: 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20  ists consist of 
bef0: 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65  8-bit length-pre
bf00: 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69  fixed, byte stri
bf10: 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d  ngs */..for (j =
bf20: 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20   0, p = protos; 
bf30: 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a  j < cnt; j++) {.
bf40: 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d  .    char *str =
bf50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
bf60: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26  omObj(list[j], &
bf70: 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20  len);..    *p++ 
bf80: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
bf90: 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63  ) len;..    memc
bfa0: 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65  py(p, str, (size
bfb0: 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70  _t) len);..    p
bfc0: 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a   += len;..}.../*
bfd0: 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72   SSL_set_alpn_pr
bfe0: 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70  otos makes a cop
bff0: 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f  y of the protoco
c000: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f  l-list */../* No
c010: 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  te: This functio
c020: 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72  n reverses the r
c030: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76  eturn value conv
c040: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53  ention */..if (S
c050: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74  SL_set_alpn_prot
c060: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  os(statePtr->ssl
c070: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73  , protos, protos
c080: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63  _len)) {..    Tc
c090: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c0a0: 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e  nterp, "Set ALPN
c0b0: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65   protocols faile
c0c0: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
c0d0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
c0e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
c0f0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
c100: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
c110: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
c120: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
c130: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
c140: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
c150: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
c160: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72  ;..    ckfree(pr
c170: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75  otos);..    retu
c180: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
c190: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74  .../* Store prot
c1a0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73  ocols list */..s
c1b0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c1c0: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65  = protos;..state
c1d0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c1e0: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  = protos_len;.  
c1f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
c200: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
c210: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ULL;..statePtr->
c220: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
c230: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
c240: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
c250: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  ks.     */.    S
c260: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_set_app_data(
c270: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c280: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c290: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20  ;./* point back 
c2a0: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c  to us */.    SSL
c2b0: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
c2c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
c2d0: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
c2e0: 6b 29 3b 0a 20 20 20 20 2f 2a 53 53 4c 5f 73 65  k);.    /*SSL_se
c2f0: 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 53  t_verify_depth(S
c300: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_set_verify_de
c310: 70 74 68 2c 20 30 29 3b 2a 2f 0a 20 20 20 20 53  pth, 0);*/.    S
c320: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  SL_set_info_call
c330: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
c340: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  sl, InfoCallback
c350: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62  );..    /* Callb
c360: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e  ack for observin
c370: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  g protocol messa
c380: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ges */.#ifndef O
c390: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52  PENSSL_NO_SSL_TR
c3a0: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20  ACE.    /* void 
c3b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
c3c0: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
c3d0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
c3e0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
c3f0: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f     void SSL_CTX_
c400: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c410: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c420: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
c430: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  ; */.    SSL_set
c440: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
c450: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  g(statePtr->ssl,
c460: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c470: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  r);.    SSL_set_
c480: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
c490: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73  tePtr->ssl, Mess
c4a0: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65  ageCallback);.#e
c4b0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ndif..    /* Cre
c4c0: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  ate Tcl_Channel 
c4d0: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  BIO Handler */. 
c4e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62     statePtr->p_b
c4f0: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  io.= BIO_new_tcl
c500: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e  (statePtr, BIO_N
c510: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61  OCLOSE);.    sta
c520: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f  tePtr->bio.= BIO
c530: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29  _new(BIO_f_ssl()
c540: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76  );..    if (serv
c550: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72  er) {../* Server
c560: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53   callbacks */..S
c570: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
c580: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67  t_servername_arg
c590: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c5a0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c5b0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c5c0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c5d0: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  e_callback(state
c5e0: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c  Ptr->ctx, SNICal
c5f0: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58  lback);..SSL_CTX
c600: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  _set_client_hell
c610: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  o_cb(statePtr->c
c620: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  tx, HelloCallbac
c630: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c640: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65  Ptr);..if (state
c650: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
c660: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
c670: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c  CTX_set_alpn_sel
c680: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c690: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c6a0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c6b0: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53  ePtr);.#ifdef US
c6c0: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74  E_NPN..    if (t
c6d0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c6e0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53  s1_3 == 0) {...S
c6f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f  SL_CTX_set_next_
c700: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65  protos_advertise
c710: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  d_cb(statePtr->c
c720: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c  tx, NPNCallback,
c730: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c740: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69  r);..    }.#endi
c750: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65  f..}.../* Enable
c760: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20   server to send 
c770: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74  cert request aft
c780: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c  er handshake (TL
c790: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09  S 1.3 only) */..
c7a0: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61  /* A write opera
c7b0: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70  tion must take p
c7c0: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72  lace for the Cer
c7d0: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74  tificate Request
c7e0: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20   to be..   sent 
c7f0: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74  to the client, t
c800: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20  his can be done 
c810: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64  with SSL_do_hand
c820: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20  shake(). */..if 
c830: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c840: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c  _handshake && tl
c850: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c  s1_3) {..    SSL
c860: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70  _verify_client_p
c870: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74  ost_handshake(st
c880: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
c890: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
c8a0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
c8b0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
c8c0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
c8d0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
c8e0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c8f0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
c900: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
c910: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
c920: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
c930: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c940: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
c950: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c960: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
c970: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c980: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
c990: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c9a0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c9b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
c9c0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
c9d0: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
c9e0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
c9f0: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
ca00: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
ca10: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
ca20: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
ca30: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
ca40: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
ca50: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
ca60: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
ca70: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
ca80: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
ca90: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
caa0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
cab0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
cac0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
cad0: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
cae0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
caf0: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
cb00: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
cb10: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
cb20: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
cb30: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
cb40: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
cb50: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
cb60: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
cb70: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 42 49  }..    /* Set BI
cb80: 4f 20 66 6f 72 20 72 65 61 64 20 61 6e 64 20 77  O for read and w
cb90: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  rite operations 
cba0: 6f 6e 20 53 53 4c 20 6f 62 6a 65 63 74 20 2a 2f  on SSL object */
cbb0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f  .    SSL_set_bio
cbc0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
cbd0: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c  statePtr->p_bio,
cbe0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
cbf0: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73  );.    BIO_set_s
cc00: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  sl(statePtr->bio
cc10: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  , statePtr->ssl,
cc20: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20   BIO_NOCLOSE);. 
cc30: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 5f 6d     BIO_set_ssl_m
cc40: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ode(statePtr->bi
cc50: 6f 2c 20 28 6c 6f 6e 67 29 20 21 73 65 72 76 65  o, (long) !serve
cc60: 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r);..    /*.    
cc70: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e   * End of SSL In
cc80: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64  it.     */.    d
cc90: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
cca0: 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  g %s", Tcl_GetCh
ccb0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
ccc0: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20  tr->self));.    
ccd0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
cce0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63  terp, (char *)Tc
ccf0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
cd00: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
cd10: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
cd20: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
cd30: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd80: 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74  -. *. * Unimport
cd90: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
cda0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
cdb0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d  s invoked to rem
cdc0: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20  ove the topmost 
cdd0: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a  channel filter..
cde0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
cdf0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
ce00: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
ce10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
ce20: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
ce30: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
ce40: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce90: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
cea0: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  nt.UnimportObjCm
ceb0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
cec0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
ced0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cee0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
cef0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
cf00: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
cf10: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
cf20: 61 6e 2c 20 70 61 72 65 6e 74 3b 09 2f 2a 20 54  an, parent;./* T
cf30: 68 65 20 73 74 61 63 6b 65 64 20 61 6e 64 20 75  he stacked and u
cf40: 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65  nderlying channe
cf50: 6c 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  ls */.    Tcl_DS
cf60: 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e  tring upperChann
cf70: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75  elTranslation, u
cf80: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
cf90: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
cfa0: 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72  lEncoding, upper
cfb0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a  ChannelEOFChar;.
cfc0: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43      int res = TC
cfd0: 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 64 70 72 69 6e  L_OK;..    dprin
cfe0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
cff0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
d000: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
d010: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
d020: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
d030: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
d040: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
d050: 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 63 68 61   /* Validate cha
d060: 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  nnel name */.   
d070: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
d080: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
d090: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d0a0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  v[1]), NULL);.  
d0b0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
d0c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
d0d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
d0e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d0f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d100: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
d110: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
d120: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
d130: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
d140: 28 63 68 61 6e 29 3b 0a 20 20 20 20 70 61 72 65  (chan);.    pare
d150: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63  nt = Tcl_GetStac
d160: 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  kedChannel(chan)
d170: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
d180: 20 69 73 20 61 20 73 74 61 63 6b 65 64 20 63 68   is a stacked ch
d190: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  annel */.    if 
d1a0: 28 70 61 72 65 6e 74 20 3d 3d 20 4e 55 4c 4c 29  (parent == NULL)
d1b0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d1c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
d1d0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
d1e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
d1f0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
d200: 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20 63 68  not a stacked ch
d210: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
d220: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
d230: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
d240: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49  erp, "TLS", "UNI
d250: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c  MPORT", "CHANNEL
d260: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
d270: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
d280: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d290: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c      }..    /* Fl
d2a0: 75 73 68 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  ush any pending 
d2b0: 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28  data */.    if (
d2c0: 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72  Tcl_OutputBuffer
d2d0: 65 64 28 63 68 61 6e 29 20 3e 20 30 20 26 26 20  ed(chan) > 0 && 
d2e0: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 29 20  Tcl_Flush(chan) 
d2f0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
d300: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d310: 6e 74 65 72 70 2c 20 22 63 61 6e 27 74 20 66 6c  nterp, "can't fl
d320: 75 73 68 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  ush channel", (c
d330: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
d340: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d350: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
d360: 69 74 20 73 74 6f 72 61 67 65 20 2a 2f 0a 20 20  it storage */.  
d370: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
d380: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
d390: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
d3a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
d3b0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
d3c0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
d3d0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
d3e0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
d3f0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
d400: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
d410: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
d420: 0a 20 20 20 20 2f 2a 20 50 72 65 73 65 72 76 65  .    /* Preserve
d430: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 6e 65 6c   current channel
d440: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 54   config */.    T
d450: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
d460: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
d470: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26  , "-blocking", &
d480: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
d490: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  king);.    Tcl_G
d4a0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d4b0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
d4c0: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65  encoding", &uppe
d4d0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
d4e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
d4f0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d500: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63  rp, chan, "-eofc
d510: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e  har", &upperChan
d520: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
d530: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
d540: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
d550: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
d560: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
d570: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a  lTranslation);..
d580: 20 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74      /* Unstack t
d590: 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  he channel */.  
d5a0: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63    if (Tcl_Unstac
d5b0: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
d5c0: 20 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b   chan) != TCL_OK
d5d0: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45  ) {..res = TCL_E
d5e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
d5f0: 20 2f 2a 20 52 65 73 74 6f 72 65 20 63 68 61 6e   /* Restore chan
d600: 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20  nel config */.  
d610: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
d620: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70  Option(interp, p
d630: 61 72 65 6e 74 2c 20 22 2d 65 6e 63 6f 64 69 6e  arent, "-encodin
d640: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
d650: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
d660: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
d670: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
d680: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70  Option(interp, p
d690: 61 72 65 6e 74 2c 20 22 2d 65 6f 66 63 68 61 72  arent, "-eofchar
d6a0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
d6b0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
d6c0: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20  lEOFChar));.    
d6d0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
d6e0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61 72  tion(interp, par
d6f0: 65 6e 74 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  ent, "-translati
d700: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
d710: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
d720: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
d730: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
d740: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d750: 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 62 6c 6f  p, parent, "-blo
d760: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  cking", Tcl_DStr
d770: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
d780: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29  hannelBlocking))
d790: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d  ;..    /* Clean-
d7a0: 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  up */.    Tcl_DS
d7b0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d7c0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d7d0: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
d7e0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
d7f0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
d800: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d810: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d820: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d830: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d840: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
d850: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 75  cking);.    retu
d860: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
d870: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4c 6f  ----. *. * TlsLo
d8c0: 61 64 43 6c 69 65 6e 74 43 41 46 69 6c 65 46 72  adClientCAFileFr
d8d0: 6f 6d 4d 65 6d 6f 72 79 20 2d 2d 20 4c 6f 61 64  omMemory -- Load
d8e0: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 72   certificates fr
d8f0: 6f 6d 20 61 20 63 6c 69 65 6e 74 0a 20 2a 09 43  om a client. *.C
d900: 41 20 66 69 6c 65 20 66 72 6f 6d 20 56 46 53 20  A file from VFS 
d910: 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 20 2a 0a  into memory.. *.
d920: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
d930: 75 6d 62 65 72 20 6f 66 20 63 65 72 74 69 66 69  umber of certifi
d940: 63 61 74 65 73 20 6c 6f 61 64 65 64 20 6f 72 20  cates loaded or 
d950: 30 20 66 6f 72 20 6e 6f 6e 65 2e 0a 20 2a 0a 20  0 for none.. *. 
d960: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d970: 20 2a 09 4c 6f 61 64 73 20 43 41 20 63 65 72 74   *.Loads CA cert
d980: 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 2d 2d  ificates. *. *--
d990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9d0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
d9e0: 0a 54 6c 73 4c 6f 61 64 43 6c 69 65 6e 74 43 41  .TlsLoadClientCA
d9f0: 46 69 6c 65 46 72 6f 6d 4d 65 6d 6f 72 79 28 54  FileFromMemory(T
da00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
da10: 70 2c 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 2c  p, SSL_CTX *ctx,
da20: 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 29 20   Tcl_Obj *file) 
da30: 7b 0a 20 20 20 20 42 49 4f 20 20 2a 62 69 6f 20  {.    BIO  *bio 
da40: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 58 35 30   = NULL;.    X50
da50: 39 20 2a 63 65 72 74 20 3d 20 4e 55 4c 4c 3b 0a  9 *cert = NULL;.
da60: 20 20 20 20 58 35 30 39 5f 53 54 4f 52 45 20 2a      X509_STORE *
da70: 73 74 6f 72 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  store = NULL;.  
da80: 20 20 54 63 6c 5f 4f 62 6a 20 20 20 20 2a 62 75    Tcl_Obj    *bu
da90: 66 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  f = NULL;.    co
daa0: 6e 73 74 20 76 6f 69 64 20 2a 64 61 74 61 20 3d  nst void *data =
dab0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 58 35 30 39 5f   NULL;.    X509_
dac0: 4e 41 4d 45 20 20 2a 6e 61 6d 65 20 3d 20 4e 55  NAME  *name = NU
dad0: 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46  LL;.    STACK_OF
dae0: 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72  (X509_NAME) *cer
daf0: 74 4e 61 6d 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  tNames = NULL;. 
db00: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a     int ret = 0;.
db10: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
db20: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65   = 0;..    /* Re
db30: 61 64 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  ad file into mem
db40: 6f 72 79 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43  ory */.    Tcl_C
db50: 68 61 6e 6e 65 6c 20 69 6e 20 3d 20 54 63 6c 5f  hannel in = Tcl_
db60: 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65  FSOpenFileChanne
db70: 6c 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 2c 20  l(interp, file, 
db80: 22 72 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 20  "r", 0);.    if 
db90: 28 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (in == NULL) {..
dba0: 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 20 20  goto cleanup;.  
dbb0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 43    }.    Tcl_SetC
dbc0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
dbd0: 65 72 70 2c 20 69 6e 2c 20 22 2d 65 6e 63 6f 64  erp, in, "-encod
dbe0: 69 6e 67 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ing", "binary");
dbf0: 0a 20 20 20 20 62 75 66 20 3d 20 54 63 6c 5f 4e  .    buf = Tcl_N
dc00: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c  ewObj();.    Tcl
dc10: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 62 75  _IncrRefCount(bu
dc20: 66 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c  f);..    if (Tcl
dc30: 5f 52 65 61 64 43 68 61 72 73 28 69 6e 2c 20 62  _ReadChars(in, b
dc40: 75 66 2c 20 2d 31 2c 20 30 29 20 3c 20 30 29 20  uf, -1, 0) < 0) 
dc50: 7b 0a 09 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74  {..Tcl_Close(int
dc60: 65 72 70 2c 20 69 6e 29 3b 0a 09 67 6f 74 6f 20  erp, in);..goto 
dc70: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
dc80: 20 20 20 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74     Tcl_Close(int
dc90: 65 72 70 2c 20 69 6e 29 3b 0a 0a 20 20 20 20 64  erp, in);..    d
dca0: 61 74 61 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69  ata = (const voi
dcb0: 64 20 2a 29 20 54 63 6c 5f 47 65 74 42 79 74 65  d *) Tcl_GetByte
dcc0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 62 75 66  ArrayFromObj(buf
dcd0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 62 69 6f  , &len);.    bio
dce0: 20 3d 20 42 49 4f 5f 6e 65 77 5f 6d 65 6d 5f 62   = BIO_new_mem_b
dcf0: 75 66 28 64 61 74 61 2c 20 6c 65 6e 29 3b 0a 20  uf(data, len);. 
dd00: 20 20 20 69 66 20 28 62 69 6f 20 3d 3d 20 4e 55     if (bio == NU
dd10: 4c 4c 29 20 7b 0a 09 67 6f 74 6f 20 63 6c 65 61  LL) {..goto clea
dd20: 6e 75 70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nup;.    }..    
dd30: 2f 2a 20 57 68 65 72 65 20 74 68 65 20 63 65 72  /* Where the cer
dd40: 74 73 20 67 6f 20 2a 2f 0a 20 20 20 20 73 74 6f  ts go */.    sto
dd50: 72 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  re = SSL_CTX_get
dd60: 5f 63 65 72 74 5f 73 74 6f 72 65 28 63 74 78 29  _cert_store(ctx)
dd70: 3b 0a 20 20 20 20 69 66 20 28 73 74 6f 72 65 20  ;.    if (store 
dd80: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 73 74 6f 72  == NULL) {..stor
dd90: 65 20 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 6e  e = X509_STORE_n
dda0: 65 77 28 29 3b 0a 09 69 66 20 28 73 74 6f 72 65  ew();..if (store
ddb0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
ddc0: 20 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 09   goto cleanup;..
ddd0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
dde0: 57 68 65 72 65 20 74 68 65 20 43 41 20 6e 61 6d  Where the CA nam
ddf0: 65 73 20 67 6f 20 2a 2f 0a 20 20 20 20 63 65 72  es go */.    cer
de00: 74 4e 61 6d 65 73 20 3d 20 73 6b 5f 58 35 30 39  tNames = sk_X509
de10: 5f 4e 41 4d 45 5f 6e 65 77 5f 6e 75 6c 6c 28 29  _NAME_new_null()
de20: 3b 0a 20 20 20 20 69 66 20 28 21 63 65 72 74 4e  ;.    if (!certN
de30: 61 6d 65 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ames) {.        
de40: 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 20 20  goto cleanup;.  
de50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 74 65    }..    /* Atte
de60: 6d 70 74 20 74 6f 20 6c 6f 61 64 20 61 6c 6c 20  mpt to load all 
de70: 63 65 72 74 73 20 66 72 6f 6d 20 74 68 65 20 50  certs from the P
de80: 45 4d 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 77  EM file */.    w
de90: 68 69 6c 65 20 28 28 63 65 72 74 20 3d 20 50 45  hile ((cert = PE
dea0: 4d 5f 72 65 61 64 5f 62 69 6f 5f 58 35 30 39 28  M_read_bio_X509(
deb0: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  bio, NULL, 0, NU
dec0: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  LL)) != NULL) {.
ded0: 20 20 20 20 20 20 20 20 69 66 20 28 58 35 30 39          if (X509
dee0: 5f 53 54 4f 52 45 5f 61 64 64 5f 63 65 72 74 28  _STORE_add_cert(
def0: 73 74 6f 72 65 2c 20 63 65 72 74 29 20 3d 3d 20  store, cert) == 
df00: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
df10: 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29   X509_free(cert)
df20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
df30: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
df40: 20 20 20 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b     goto cleanup;
df50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
df60: 20 20 20 2f 2a 20 43 6f 70 79 20 6e 61 6d 65 20     /* Copy name 
df70: 74 6f 20 73 74 61 63 6b 20 62 65 66 6f 72 65 20  to stack before 
df80: 63 65 72 74 69 66 69 63 61 74 65 20 67 65 74 73  certificate gets
df90: 20 66 72 65 65 64 20 2a 2f 0a 09 6e 61 6d 65 20   freed */..name 
dfa0: 3d 20 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  = X509_get_subje
dfb0: 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 20  ct_name(cert);. 
dfc0: 20 20 20 20 20 20 20 69 66 20 28 6e 61 6d 65 29         if (name)
dfd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 58   {.            X
dfe0: 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 5f 63  509_NAME *name_c
dff0: 6f 70 79 20 3d 20 58 35 30 39 5f 4e 41 4d 45 5f  opy = X509_NAME_
e000: 64 75 70 28 6e 61 6d 65 29 3b 0a 20 20 20 20 20  dup(name);.     
e010: 20 20 20 20 20 20 20 69 66 20 28 21 6e 61 6d 65         if (!name
e020: 5f 63 6f 70 79 20 7c 7c 20 21 73 6b 5f 58 35 30  _copy || !sk_X50
e030: 39 5f 4e 41 4d 45 5f 70 75 73 68 28 63 65 72 74  9_NAME_push(cert
e040: 4e 61 6d 65 73 2c 20 6e 61 6d 65 5f 63 6f 70 79  Names, name_copy
e050: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
e060: 20 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63       X509_free(c
e070: 65 72 74 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b  ert);...ret = 0;
e080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e090: 20 67 6f 74 6f 20 63 6c 65 61 6e 75 70 3b 0a 20   goto cleanup;. 
e0a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e0b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 58       }.        X
e0c0: 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
e0d0: 20 20 20 20 20 20 20 20 72 65 74 20 2b 2b 3b 0a          ret ++;.
e0e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
e0f0: 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 72 74 20   least one cert 
e100: 77 61 73 20 61 64 64 65 64 20 73 6f 20 72 65 74  was added so ret
e110: 61 69 6e 20 74 68 65 20 73 74 6f 72 65 20 61 6e  ain the store an
e120: 64 20 43 41 20 6c 69 73 74 20 2a 2f 0a 20 20 20  d CA list */.   
e130: 20 69 66 20 28 72 65 74 29 20 7b 0a 09 69 66 20   if (ret) {..if 
e140: 28 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 65 72  (SSL_CTX_get_cer
e150: 74 5f 73 74 6f 72 65 28 63 74 78 29 20 3d 3d 20  t_store(ctx) == 
e160: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
e170: 5f 43 54 58 5f 73 65 74 5f 63 65 72 74 5f 73 74  _CTX_set_cert_st
e180: 6f 72 65 28 63 74 78 2c 20 73 74 6f 72 65 29 3b  ore(ctx, store);
e190: 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ..}..SSL_CTX_set
e1a0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
e1b0: 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b  ctx, certNames);
e1c0: 0a 20 20 20 20 7d 0a 0a 20 20 63 6c 65 61 6e 75  .    }..  cleanu
e1d0: 70 3a 0a 0a 20 20 20 20 69 66 20 28 21 20 72 65  p:..    if (! re
e1e0: 74 29 20 7b 0a 09 2f 2a 20 4e 65 77 20 73 74 6f  t) {../* New sto
e1f0: 72 65 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  re is not requir
e200: 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 6f 72 65  ed */..if (store
e210: 20 21 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f   != SSL_CTX_get_
e220: 63 65 72 74 5f 73 74 6f 72 65 28 63 74 78 29 29  cert_store(ctx))
e230: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 53 54 4f   {..    X509_STO
e240: 52 45 5f 66 72 65 65 28 73 74 6f 72 65 29 3b 0a  RE_free(store);.
e250: 09 7d 0a 09 2f 2a 20 43 65 72 74 20 6e 61 6d 65  .}../* Cert name
e260: 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  s will not be us
e270: 65 64 20 2a 2f 0a 09 69 66 20 28 63 65 72 74 4e  ed */..if (certN
e280: 61 6d 65 73 29 20 7b 0a 09 20 20 20 20 73 6b 5f  ames) {..    sk_
e290: 58 35 30 39 5f 4e 41 4d 45 5f 70 6f 70 5f 66 72  X509_NAME_pop_fr
e2a0: 65 65 28 63 65 72 74 4e 61 6d 65 73 2c 20 58 35  ee(certNames, X5
e2b0: 30 39 5f 4e 41 4d 45 5f 66 72 65 65 29 3b 0a 09  09_NAME_free);..
e2c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 42 49 4f  }.    }..    BIO
e2d0: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 0a 20 20 20  _free(bio);..   
e2e0: 20 69 66 20 28 62 75 66 29 0a 09 54 63 6c 5f 44   if (buf)..Tcl_D
e2f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 62 75 66 29  ecrRefCount(buf)
e300: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;..    return re
e310: 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  t;.}.../*. *----
e320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e360: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d   *. * CTX_Init -
e370: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53  - construct a SS
e380: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20  L_CTX instance. 
e390: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
e3a0: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58  .A valid SSL_CTX
e3b0: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c   instance or NUL
e3c0: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  L.. *. * Side ef
e3d0: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
e3e0: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74  ucts SSL context
e3f0: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d   (CTX). *. *----
e400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e440: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f   */..static SSL_
e450: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 0a  CTX *.CTX_Init(.
e460: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
e470: 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 69 73 53  Ptr,.    int isS
e480: 65 72 76 65 72 2c 0a 20 20 20 20 69 6e 74 20 70  erver,.    int p
e490: 72 6f 74 6f 2c 0a 20 20 20 20 63 68 61 72 20 2a  roto,.    char *
e4a0: 6b 65 79 66 69 6c 65 2c 0a 20 20 20 20 63 68 61  keyfile,.    cha
e4b0: 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20  r *certfile,.   
e4c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e4d0: 6b 65 79 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65  key,.    unsigne
e4e0: 64 20 63 68 61 72 20 2a 63 65 72 74 2c 0a 20 20  d char *cert,.  
e4f0: 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c    Tcl_Size key_l
e500: 65 6e 2c 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  en,.    Tcl_Size
e510: 20 63 65 72 74 5f 6c 65 6e 2c 0a 20 20 20 20 63   cert_len,.    c
e520: 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20  har *CApath,.   
e530: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a   char *CAstore,.
e540: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
e550: 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ,.    char *ciph
e560: 65 72 73 2c 0a 20 20 20 20 63 68 61 72 20 2a 63  ers,.    char *c
e570: 69 70 68 65 72 73 75 69 74 65 73 2c 0a 20 20 20  iphersuites,.   
e580: 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 20 20 20 20   int level,.    
e590: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 0a  char *DHparams).
e5a0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
e5b0: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65   *interp = state
e5c0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
e5d0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20   SSL_CTX *ctx = 
e5e0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53  NULL;.    Tcl_DS
e5f0: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e  tring ds;.    in
e600: 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74  t off = 0, abort
e610: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f   = 0;.    int lo
e620: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a  ad_private_key;.
e630: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45      const SSL_ME
e640: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20  THOD *method;.. 
e650: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
e660: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21  ed");..    if (!
e670: 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70  proto) {..Tcl_Ap
e680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e690: 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f  p, "no valid pro
e6a0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c  tocol selected",
e6b0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
e6c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
e6d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
e6e0: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
e6f0: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
e700: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
e710: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
e720: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
e730: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
e740: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
e750: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
e760: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
e770: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
e780: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e790: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
e7a0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
e7b0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
e7c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
e7d0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
e7e0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c  ined(NO_SSL3) ||
e7f0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
e800: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66  _NO_SSL3).    if
e810: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
e820: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29   TLS_PROTO_SSL3)
e830: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
e840: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
e850: 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL3 protocol not
e860: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
e870: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
e880: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
e890: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
e8a0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
e8b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e8c0: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28  O_TLS1).    if (
e8d0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
e8e0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20  LS_PROTO_TLS1)) 
e8f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e900: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
e910: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.0 protocol no
e920: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
e930: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
e940: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e950: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
e960: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
e970: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
e980: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
e990: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
e9a0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
e9b0: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
e9c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e9d0: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
e9e0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
e9f0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ed", (char *)NUL
ea00: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
ea10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
ea20: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
ea30: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
ea40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
ea50: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
ea60: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
ea70: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
ea80: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
ea90: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
eaa0: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
eab0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
eac0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
ead0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
eae0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
eaf0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
eb00: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
eb10: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
eb20: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
eb30: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
eb40: 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _3)) {..Tcl_Appe
eb50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
eb60: 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63   "TLS 1.3 protoc
eb70: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
eb80: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
eb90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
eba0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ebb0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29   if (proto == 0)
ebc0: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20   {../* Use full 
ebd0: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54  range */..SSL_CT
ebe0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
ebf0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
ec00: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
ec10: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
ec20: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ctx, 0);.    }..
ec30: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
ec40: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  o) {.#if OPENSSL
ec50: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
ec60: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
ec70: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
ec80: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
ec90: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
eca0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
ecb0: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64  TO_SSL2:..method
ecc0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
ecd0: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv2_server_metho
ece0: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65  d() : SSLv2_clie
ecf0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
ed00: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
ed10: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
ed20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
ed30: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
ed40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
ed50: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
ed60: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
ed70: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
ed80: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
ed90: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65   SSLv3_server_me
eda0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63  thod() : SSLv3_c
edb0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
edc0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
edd0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
ede0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
edf0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
ee00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
ee10: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
ee20: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
ee30: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
ee40: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
ee50: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72  r ? TLSv1_server
ee60: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
ee70: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
ee80: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
ee90: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
eea0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
eeb0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
eec0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
eed0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
eee0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
eef0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
ef00: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f  O_TLS1_1:..metho
ef10: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
ef20: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65  LSv1_1_server_me
ef30: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31  thod() : TLSv1_1
ef40: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
ef50: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
ef60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
ef70: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
ef80: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
ef90: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
efa0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
efb0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
efc0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
efd0: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
efe0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
eff0: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_2_server_met
f000: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f  hod() : TLSv1_2_
f010: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
f020: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
f030: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
f040: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
f050: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
f060: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
f070: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
f080: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65  :../* Use the ge
f090: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64  neric method and
f0a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67   constraint rang
f0b0: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20  e after context 
f0c0: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d  is created */..m
f0d0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
f0e0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
f0f0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
f100: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
f110: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
f120: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65   default:../* Ne
f130: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20  gotiate highest 
f140: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c  available SSL/TL
f150: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65  S version */..me
f160: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
f170: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
f180: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
f190: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  nt_method();.#if
f1a0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
f1b0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
f1c0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
f1d0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
f1e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
f1f0: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
f200: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
f210: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
f220: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
f230: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
f240: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
f250: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
f260: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
f270: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
f280: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
f290: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
f2a0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
f2b0: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
f2c0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
f2d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
f2e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
f2f0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
f300: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
f310: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
f320: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
f330: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
f340: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
f350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
f360: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
f370: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
f380: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
f390: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
f3a0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
f3b0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
f3c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
f3d0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
f3e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
f3f0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
f400: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
f410: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
f420: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
f430: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
f440: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
f450: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
f460: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
f470: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
f480: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
f490: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
f4a0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
f4b0: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
f4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
f4d0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
f4e0: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20  r();..    ctx = 
f4f0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
f500: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74  od);.    if (!ct
f510: 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  x) {..return NUL
f520: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
f530: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c   (getenv(SSLKEYL
f540: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f  OGFILE)) {..SSL_
f550: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63  CTX_set_keylog_c
f560: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79  allback(ctx, Key
f570: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  LogCallback);.  
f580: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
f590: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
f5a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
f5b0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
f5c0: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53  if (proto == TLS
f5d0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b  _PROTO_TLS1_3) {
f5e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
f5f0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
f600: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
f610: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
f620: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
f630: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
f640: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d  _VERSION);.    }
f650: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f660: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c  Force cipher sel
f670: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20  ection order by 
f680: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66  server */.    if
f690: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09   (!isServer) {..
f6a0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
f6b0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
f6c0: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52  CIPHER_SERVER_PR
f6d0: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d  EFERENCE);.    }
f6e0: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
f6f0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
f700: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f  x10100000L.    O
f710: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61  penSSL_add_all_a
f720: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20  lgorithms(); /* 
f730: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64  Load ciphers and
f740: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64   digests */.#end
f750: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  if..    SSL_CTX_
f760: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78  set_app_data(ctx
f770: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29  , (void*)interp)
f780: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68  ;./* remember th
f790: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  e interpreter */
f7a0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
f7b0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
f7c0: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 45 6e  L_OP_ALL);./* En
f7d0: 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20 62 75 67  able all SSL bug
f7e0: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
f7f0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
f800: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
f810: 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49  _OP_NO_COMPRESSI
f820: 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62 6c 65 20  ON);./* Disable 
f830: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e  compression even
f840: 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f   if supported */
f850: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
f860: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
f870: 66 29 3b 09 09 2f 2a 20 44 69 73 61 62 6c 65 20  f);../* Disable 
f880: 73 70 65 63 69 66 69 65 64 20 70 72 6f 74 6f 63  specified protoc
f890: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 0a  ol versions */..
f8a0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 77 72 69      /* Allow wri
f8b0: 74 65 73 20 74 6f 20 72 65 70 6f 72 74 20 73 75  tes to report su
f8c0: 63 63 65 73 73 20 77 68 65 6e 20 6c 65 73 73 20  ccess when less 
f8d0: 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f 72 64 73  than all records
f8e0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
f8f0: 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  en */.    SSL_CT
f900: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20  X_set_mode(ctx, 
f910: 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42 4c 45 5f  SSL_MODE_ENABLE_
f920: 50 41 52 54 49 41 4c 5f 57 52 49 54 45 29 3b 0a  PARTIAL_WRITE);.
f930: 0a 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  .    /* Disable 
f940: 61 74 74 65 6d 70 74 73 20 74 6f 20 74 72 79 20  attempts to try 
f950: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 6e  to process the n
f960: 65 78 74 20 72 65 63 6f 72 64 20 69 6e 73 74 65  ext record inste
f970: 61 64 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ad of returning 
f980: 61 66 74 65 72 20 61 0a 20 20 20 20 20 20 20 6e  after a.       n
f990: 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64 2e 20 41  on-app record. A
f9a0: 76 6f 69 64 73 20 68 61 6e 67 73 20 69 6e 20 62  voids hangs in b
f9b0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 77 68  locking mode, wh
f9c0: 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f 72 65 61  en using SSL_rea
f9d0: 64 28 29 20 61 6e 64 20 61 0a 20 20 20 20 20 20  d() and a.      
f9e0: 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74 69 6f 6e   non-application
f9f0: 20 72 65 63 6f 72 64 20 77 61 73 20 73 65 6e 74   record was sent
fa00: 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 70 70   without any app
fa10: 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 2e 20 2a  lication data. *
fa20: 2f 0a 20 20 20 20 2f 2a 53 53 4c 5f 43 54 58 5f  /.    /*SSL_CTX_
fa30: 63 6c 65 61 72 5f 6d 6f 64 65 28 63 74 78 2c 20  clear_mode(ctx, 
fa40: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45  SSL_MODE_AUTO_RE
fa50: 54 52 59 29 3b 2a 2f 0a 0a 20 20 20 20 53 53 4c  TRY);*/..    SSL
fa60: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61  _CTX_sess_set_ca
fa70: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32  che_size(ctx, 12
fa80: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  8);..    /* Set 
fa90: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70  user defined cip
faa0: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69  hers, cipher sui
fab0: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74  tes, and securit
fac0: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
fad0: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e  f ((ciphers != N
fae0: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58  ULL) && !SSL_CTX
faf0: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74  _set_cipher_list
fb00: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20  (ctx, ciphers)) 
fb10: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
fb20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
fb30: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a   ciphers failed:
fb40: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
fb50: 73 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  s", (char *)NULL
fb60: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
fb70: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
fb80: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
fb90: 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73  f ((ciphersuites
fba0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53   != NULL) && !SS
fbb0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72  L_CTX_set_cipher
fbc0: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68  suites(ctx, ciph
fbd0: 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63  ersuites)) {..Tc
fbe0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fbf0: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68  nterp, "Set ciph
fc00: 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64  er suites failed
fc10: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
fc20: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  rs", (char *)NUL
fc30: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
fc40: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
fc50: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
fc60: 20 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69   /* set automati
fc70: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f  c curve selectio
fc80: 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  n */.    SSL_CTX
fc90: 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 63  _set_ecdh_auto(c
fca0: 74 78 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  tx, 1);..    /* 
fcb0: 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76  Set security lev
fcc0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65  el */.    if (le
fcd0: 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65  vel > -1 && leve
fce0: 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c  l < 6) {../* SSL
fcf0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _set_security_le
fd00: 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  vel */..SSL_CTX_
fd10: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  set_security_lev
fd20: 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a  el(ctx, level);.
fd30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
fd40: 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73  t some callbacks
fd50: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
fd60: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
fd70: 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77  wd_cb(ctx, Passw
fd80: 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ordCallback);.  
fd90: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65    SSL_CTX_set_de
fda0: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f  fault_passwd_cb_
fdb0: 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76  userdata(ctx, (v
fdc0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
fdd0: 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20  ..    /* read a 
fde0: 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70  Diffie-Hellman p
fdf0: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20  arameters file, 
fe00: 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74  or use the built
fe10: 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54  -in one */.    T
fe20: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
fe30: 64 73 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e  ds);.#ifdef OPEN
fe40: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66  SSL_NO_DH.    if
fe50: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55   (DHparams != NU
fe60: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
fe70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fe80: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75  "DH parameter su
fe90: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61  pport not availa
fea0: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ble", (char *)NU
feb0: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
fec0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
fed0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c   NULL;.    }.#el
fee0: 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68  se.    {..DH* dh
fef0: 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20  ;..if (DHparams 
ff00: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
ff10: 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20  BIO *bio;...    
ff20: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69  bio = BIO_new_fi
ff30: 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c  le(F2N(DHparams,
ff40: 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20   &ds), "r");..  
ff50: 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09    if (!bio) {...
ff60: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ff70: 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  &ds);...Tcl_Appe
ff80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ff90: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64   "Could not find
ffa0: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66   DH parameters f
ffb0: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ile", (char *)NU
ffc0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ffd0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ffe0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
fff0: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72  ..    dh = PEM_r
10000 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73  ead_bio_DHparams
10010 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  (bio, NULL, NULL
10020 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49  , NULL);..    BI
10030 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20  O_free(bio);..  
10040 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
10050 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  e(&ds);..    if 
10060 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70  (!dh) {...Tcl_Ap
10070 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10080 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65  p, "Could not re
10090 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  ad DH parameters
100a0 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68   from file", (ch
100b0 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53  ar *)NULL);...SS
100c0 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
100d0 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
100e0 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f  .    }..    SSL_
100f0 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63  CTX_set_tmp_dh(c
10100 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48  tx, dh);..    DH
10110 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65  _free(dh);...} e
10120 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73  lse {..    /* Us
10130 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20  e well known DH 
10140 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
10150 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75  have built-in su
10160 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c  pport in OpenSSL
10170 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53   */..    if (!SS
10180 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74  L_CTX_set_dh_aut
10190 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54  o(ctx, 1)) {...T
101a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
101b0 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
101c0 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48  ot enable set DH
101d0 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52   auto: ", GET_ER
101e0 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
101f0 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c  r *)NULL);...SSL
10200 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
10210 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
10220 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23      }..}.    }.#
10230 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65  endif..    /* se
10240 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74  t our certificat
10250 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72  e */.    load_pr
10260 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20  ivate_key = 0;. 
10270 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
10280 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
10290 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
102a0 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
102b0 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
102c0 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65  file(ctx, F2N(ce
102d0 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53  rtfile, &ds), SS
102e0 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
102f0 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  <= 0) {..    Tcl
10300 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10310 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
10320 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10330 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
10340 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
10350 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
10360 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52   ",...    GET_ER
10370 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
10380 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
10390 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
103a0 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
103b0 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74  ULL;..}..Tcl_DSt
103c0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
103d0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
103e0 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ert != NULL) {..
103f0 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
10400 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43   = 1;..if (SSL_C
10410 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
10420 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72  te_ASN1(ctx, cer
10430 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20  t_len, cert) <= 
10440 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  0) {..    Tcl_Ap
10450 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10460 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
10470 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22  t certificate: "
10480 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f  ,...    GET_ERR_
10490 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
104a0 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  *)NULL);..    SS
104b0 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
104c0 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
104d0 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
104e0 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28   {..certfile = (
104f0 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64  char*)X509_get_d
10500 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65  efault_cert_file
10510 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  ();...if (SSL_CT
10520 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
10530 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74  e_file(ctx, cert
10540 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59  file, SSL_FILETY
10550 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
10560 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41  #if 0..    Tcl_A
10570 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10580 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75  rp, "unable to u
10590 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69  se default certi
105a0 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
105b0 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
105c0 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41  .    GET_ERR_REA
105d0 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
105e0 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
105f0 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
10600 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
10610 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a  #endif..}.    }.
10620 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
10630 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20  private key */. 
10640 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76     if (load_priv
10650 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28  ate_key) {..if (
10660 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20  keyfile == NULL 
10670 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20  && key == NULL) 
10680 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d  {..    keyfile =
10690 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09   certfile;..}...
106a0 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e  if (keyfile != N
106b0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67  ULL) {..    /* g
106c0 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b  et the private k
106d0 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
106e0 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63  th this certific
106f0 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28  ate */..    if (
10700 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  keyfile == NULL)
10710 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63   {...keyfile = c
10720 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a  ertfile;..    }.
10730 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54  ..    if (SSL_CT
10740 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79  X_use_PrivateKey
10750 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b  _file(ctx, F2N(k
10760 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53  eyfile, &ds), SS
10770 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
10780 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53  <= 0) {...Tcl_DS
10790 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
107a0 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70  ../* flush the p
107b0 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20  assphrase which 
107c0 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
107d0 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09   the result */..
107e0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
107f0 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c  nterp, NULL, TCL
10800 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f  _STATIC);...Tcl_
10810 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10820 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
10830 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66  set public key f
10840 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20  ile ", keyfile, 
10850 22 20 22 2c 0a 09 09 09 47 45 54 5f 45 52 52 5f  " ",....GET_ERR_
10860 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
10870 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  *)NULL);...SSL_C
10880 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
10890 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
108a0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
108b0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
108c0 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20  .} else if (key 
108d0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
108e0 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
108f0 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28  PrivateKey_ASN1(
10900 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74  EVP_PKEY_RSA, ct
10910 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65  x, key, (int) ke
10920 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09  y_len) <= 0) {..
10930 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
10940 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
10950 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
10960 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
10970 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
10980 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
10990 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
109a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
109b0 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
109c0 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22  et public key: "
109d0 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
109e0 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  (), (char *)NULL
109f0 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
10a00 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
10a10 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d   NULL;..    }..}
10a20 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77  ../* Now we know
10a30 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20   that a key and 
10a40 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73  cert have been s
10a50 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74  et against.. * t
10a60 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  he SSL context *
10a70 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f  /..if (!SSL_CTX_
10a80 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65  check_private_ke
10a90 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54  y(ctx)) {..    T
10aa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10ab0 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65  interp, "private
10ac0 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
10ad0 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63  tch the certific
10ae0 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c  ate public key",
10af0 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a  ....     (char *
10b00 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c  )NULL);..    SSL
10b10 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
10b20 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
10b30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
10b40 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 74 68  /* Set to use th
10b50 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69  e default locati
10b60 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20  on and file for 
10b70 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68  Certificate Auth
10b80 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69  ority (CA) certi
10b90 66 69 63 61 74 65 73 2e 0a 20 20 20 20 20 2a 20  ficates..     * 
10ba0 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63  The default CA c
10bb0 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65  ertificates dire
10bc0 63 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 64 20  ctory is called 
10bd0 63 65 72 74 73 20 69 6e 20 74 68 65 20 64 65 66  certs in the def
10be0 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 20 20  ault OpenSSL.   
10bf0 20 20 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 49    * directory. I
10c00 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
10c10 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69  A certificates i
10c20 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 77 69  n PEM format, wi
10c30 74 68 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61  th one certifica
10c40 74 65 20 70 65 72 0a 20 20 20 20 20 2a 20 66 69  te per.     * fi
10c50 6c 65 2e 20 54 68 65 20 76 65 72 69 66 79 20 70  le. The verify p
10c60 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61  ath and store ca
10c70 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
10c80 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f  by the SSL_CERT_
10c90 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65  DIR env var. The
10ca0 0a 20 20 20 20 20 2a 20 64 65 66 61 75 6c 74 20  .     * default 
10cb0 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20  CA certificates 
10cc0 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63  file is called c
10cd0 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64  ert.pem in the d
10ce0 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 20 64  efault OpenSSL d
10cf0 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a  irectory..     *
10d00 20 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65   The verify file
10d10 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
10d20 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45  en by the SSL_CE
10d30 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e  RT_FILE env var.
10d40 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c   */.    if (!SSL
10d50 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
10d60 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74  _verify_paths(ct
10d70 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a  x)) {..abort++;.
10d80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76      }..    /* Ov
10d90 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20  errides for the 
10da0 43 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61  CA verify path a
10db0 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b  nd file */.    {
10dc0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
10dd0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
10de0 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43  30000000L..if (C
10df0 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Apath != NULL ||
10e00 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29   CAfile != NULL)
10e10 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
10e20 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63  ing ds1;..    Tc
10e30 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
10e40 73 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21  s1);...    if (!
10e50 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
10e60 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74  ify_locations(ct
10e70 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  x, F2N(CAfile, &
10e80 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c  ds), F2N(CApath,
10e90 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f   &ds1))) {...abo
10ea0 72 74 2b 2b 3b 0a 09 09 72 65 74 75 72 6e 20 4e  rt++;...return N
10eb0 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
10ec0 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
10ed0 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
10ee0 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31  DStringFree(&ds1
10ef0 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20  );...    /* Set 
10f00 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73  list of CAs to s
10f10 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68  end to client wh
10f20 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  en requesting a 
10f30 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61  client certifica
10f40 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74  te */..    /* ht
10f50 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67  tps://sourceforg
10f60 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73  e.net/p/tls/bugs
10f70 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  /57/ */..    /* 
10f80 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68  XXX:TODO: Let th
10f90 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61  e user supply va
10fa0 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61  lues here instea
10fb0 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74  d of something t
10fc0 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68  hat exists on th
10fd0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a  e filesystem */.
10fe0 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
10ff0 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
11000 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
11010 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
11020 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
11030 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61  ..    if (certNa
11040 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
11050 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
11060 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
11070 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20   certNames);..  
11080 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
11090 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
110a0 7d 0a 0a 23 65 6c 73 65 0a 09 2f 2a 20 53 65 74  }..#else../* Set
110b0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
110c0 69 6e 69 6e 67 20 43 41 20 63 65 72 74 69 66 69  ining CA certifi
110d0 63 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72  cates in PEM for
110e0 6d 61 74 2e 20 2a 2f 0a 09 69 66 20 28 43 41 70  mat. */..if (CAp
110f0 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ath != NULL) {..
11100 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
11110 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72  _load_verify_dir
11120 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68  (ctx, F2N(CApath
11130 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f  , &ds))) {...abo
11140 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rt++;..    }..  
11150 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
11160 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  e(&ds);..}.../* 
11170 53 65 74 20 55 52 49 20 66 6f 72 20 74 6f 20 61  Set URI for to a
11180 20 73 74 6f 72 65 2c 20 77 68 69 63 68 20 6d 61   store, which ma
11190 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  y be a single co
111a0 6e 74 61 69 6e 65 72 20 6f 72 20 61 20 63 61 74  ntainer or a cat
111b0 61 6c 6f 67 20 6f 66 20 63 6f 6e 74 61 69 6e 65  alog of containe
111c0 72 73 2e 20 2a 2f 0a 09 69 66 20 28 43 41 73 74  rs. */..if (CAst
111d0 6f 72 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ore != NULL) {..
111e0 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
111f0 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 73 74 6f  _load_verify_sto
11200 72 65 28 63 74 78 2c 20 46 32 4e 28 43 41 73 74  re(ctx, F2N(CAst
11210 6f 72 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09  ore, &ds))) {...
11220 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a  abort++;..    }.
11230 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
11240 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 09  Free(&ds);..}...
11250 2f 2a 20 53 65 74 20 66 69 6c 65 20 6f 66 20 43  /* Set file of C
11260 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69  A certificates i
11270 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e 20 20 2a  n PEM format.  *
11280 2f 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d  /..if (CAfile !=
11290 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63   NULL) {..    Tc
112a0 6c 5f 4f 62 6a 20 2a 63 61 66 69 6c 65 6f 62 6a  l_Obj *cafileobj
112b0 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
112c0 4f 62 6a 28 43 41 66 69 6c 65 2c 20 2d 31 29 3b  Obj(CAfile, -1);
112d0 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
112e0 66 43 6f 75 6e 74 28 63 61 66 69 6c 65 6f 62 6a  fCount(cafileobj
112f0 29 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a  );...    Tcl_Obj
11300 20 2a 66 73 69 6e 66 6f 20 3d 20 54 63 6c 5f 46   *fsinfo = Tcl_F
11310 53 46 69 6c 65 53 79 73 74 65 6d 49 6e 66 6f 28  SFileSystemInfo(
11320 63 61 66 69 6c 65 6f 62 6a 29 3b 0a 09 20 20 20  cafileobj);..   
11330 20 69 66 20 28 66 73 69 6e 66 6f 29 20 7b 0a 09   if (fsinfo) {..
11340 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e  .Tcl_IncrRefCoun
11350 74 28 66 73 69 6e 66 6f 29 3b 0a 0a 09 09 54 63  t(fsinfo);....Tc
11360 6c 5f 4f 62 6a 20 2a 66 73 74 79 70 65 20 3d 20  l_Obj *fstype = 
11370 4e 55 4c 4c 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  NULL;...Tcl_List
11380 4f 62 6a 49 6e 64 65 78 28 69 6e 74 65 72 70 2c  ObjIndex(interp,
11390 20 66 73 69 6e 66 6f 2c 20 30 2c 20 26 66 73 74   fsinfo, 0, &fst
113a0 79 70 65 29 3b 0a 0a 09 09 69 66 20 28 54 63 6c  ype);....if (Tcl
113b0 5f 53 74 72 69 6e 67 4d 61 74 63 68 28 22 6e 61  _StringMatch("na
113c0 74 69 76 65 22 2c 20 54 63 6c 5f 47 65 74 53 74  tive", Tcl_GetSt
113d0 72 69 6e 67 28 66 73 74 79 70 65 29 29 29 20 7b  ring(fstype))) {
113e0 0a 09 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  ...    if (!SSL_
113f0 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
11400 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41  file(ctx, F2N(CA
11410 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09  file, &ds))) {..
11420 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 09 20 20 20  ..abort++;...   
11430 20 7d 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74   }...    Tcl_DSt
11440 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
11450 09 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73  ..    /* Set lis
11460 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64  t of CAs to send
11470 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20   to client when 
11480 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69  requesting a cli
11490 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ent certificate 
114a0 2a 2f 0a 09 09 20 20 20 20 53 54 41 43 4b 5f 4f  */...    STACK_O
114b0 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65  F(X509_NAME) *ce
114c0 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f  rtNames = SSL_lo
114d0 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c  ad_client_CA_fil
114e0 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  e(F2N(CAfile, &d
114f0 73 29 29 3b 0a 09 09 20 20 20 20 69 66 20 28 63  s));...    if (c
11500 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
11510 29 20 7b 0a 09 09 09 53 53 4c 5f 43 54 58 5f 73  ) {....SSL_CTX_s
11520 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
11530 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73  t(ctx, certNames
11540 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20  );...    }...   
11550 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
11560 28 26 64 73 29 3b 0a 0a 09 09 7d 20 65 6c 73 65  (&ds);....} else
11570 20 7b 0a 09 09 20 20 20 20 2f 2a 20 4c 6f 61 64   {...    /* Load
11580 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 74   certificate int
11590 6f 20 6d 65 6d 6f 72 79 20 2a 2f 0a 09 09 20 20  o memory */...  
115a0 20 20 69 66 20 28 21 54 6c 73 4c 6f 61 64 43 6c    if (!TlsLoadCl
115b0 69 65 6e 74 43 41 46 69 6c 65 46 72 6f 6d 4d 65  ientCAFileFromMe
115c0 6d 6f 72 79 28 69 6e 74 65 72 70 2c 20 63 74 78  mory(interp, ctx
115d0 2c 20 63 61 66 69 6c 65 6f 62 6a 29 29 20 7b 0a  , cafileobj)) {.
115e0 09 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 09 20 20  ...abort++;...  
115f0 20 20 7d 0a 09 09 7d 0a 09 09 54 63 6c 5f 44 65    }...}...Tcl_De
11600 63 72 52 65 66 43 6f 75 6e 74 28 66 73 69 6e 66  crRefCount(fsinf
11610 6f 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65  o);...    } else
11620 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 20 2f 2a   {...abort++; /*
11630 20 50 61 74 68 20 69 73 20 6e 6f 74 20 72 65 63   Path is not rec
11640 6f 67 6e 69 7a 65 64 20 2a 2f 0a 09 20 20 20 20  ognized */..    
11650 7d 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52  }..    Tcl_DecrR
11660 65 66 43 6f 75 6e 74 28 63 61 66 69 6c 65 6f 62  efCount(cafileob
11670 6a 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20  j);..}.#endif.  
11680 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 62 6f    }..    if (abo
11690 72 74 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 72 65  rt > 0) {../* re
116a0 74 75 72 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  turn error */.  
116b0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63    }.    return c
116c0 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tx;.}.../*. *---
116d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11710 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a  . *. * StatusObj
11720 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65  Cmd -- return ce
11730 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f  rtificate for co
11740 6e 6e 65 63 74 65 64 20 70 65 65 72 20 69 6e 66  nnected peer inf
11750 6f 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  o.. *. * Results
11760 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
11770 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
11780 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
11790 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
117a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
117e0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
117f0 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 0a 20  .StatusObjCmd(. 
11800 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
11810 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49  id *),.    Tcl_I
11820 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
11830 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20     int objc,.   
11840 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20   Tcl_Obj.*const 
11850 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 53 74  objv[]).{.    St
11860 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
11870 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
11880 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
11890 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
118a0 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
118b0 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
118c0 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
118d0 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt mode;.    con
118e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
118f0 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73   *proto;.    uns
11900 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20  igned int len;. 
11910 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b     int nid, res;
11920 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
11930 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
11940 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62   (objc < 2 || ob
11950 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20  jc > 3 || (objc 
11960 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28  == 3 && !strcmp(
11970 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11980 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22  jv[1]), "-local"
11990 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67  ))) {..Tcl_Wrong
119a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
119b0 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61  1, objv, "?-loca
119c0 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  l? channel");..r
119d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
119e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
119f0 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f  et channel Id */
11a00 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  .    channelName
11a10 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11a20 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32  (objv[(objc == 2
11a30 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20   ? 1 : 2)]);.   
11a40 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
11a50 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
11a60 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64  hannelName, &mod
11a70 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
11a80 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
11a90 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
11aa0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11ab0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
11ac0 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
11ad0 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
11ae0 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
11af0 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
11b00 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
11b10 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
11b20 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
11b30 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
11b40 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
11b50 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11b60 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
11b70 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
11b80 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
11b90 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
11ba0 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
11bb0 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
11bc0 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
11bd0 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22   "TLS", "STATUS"
11be0 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
11bf0 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
11c00 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
11c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11c20 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
11c30 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74  State *) Tcl_Get
11c40 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
11c50 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
11c60 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61  /* Get certifica
11c70 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73  te for peer or s
11c80 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  elf */.    if (o
11c90 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65  bjc == 2) {..pee
11ca0 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
11cb0 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
11cc0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
11cd0 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20   } else {..peer 
11ce0 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66  = SSL_get_certif
11cf0 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
11d00 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
11d10 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74  /* Get X509 cert
11d20 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a  ificate info */.
11d30 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
11d40 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
11d50 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
11d60 20 70 65 65 72 2c 20 31 29 3b 0a 09 69 66 20 28   peer, 1);..if (
11d70 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20  objc == 2) {..  
11d80 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72    X509_free(peer
11d90 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e  );..    peer = N
11da0 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
11db0 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
11dc0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
11dd0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
11de0 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20     /* Peer name 
11df0 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
11e00 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11e10 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53  r, "peername", S
11e20 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65  SL_get0_peername
11e30 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
11e40 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e   -1);.    LAPPEN
11e50 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
11e60 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53  jPtr, "sbits", S
11e70 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
11e80 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
11e90 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63  , NULL));..    c
11ea0 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
11eb0 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
11ec0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
11ed0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
11ee0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11ef0 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
11f00 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
11f10 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63  erify the X509 c
11f20 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65  ertificate prese
11f30 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72  nted by the peer
11f40 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
11f50 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11f60 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c  tr, "verifyResul
11f70 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79  t",..X509_verify
11f80 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
11f90 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
11fa0 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
11fb0 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a  r->ssl)), -1);..
11fc0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
11fd0 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d  de */.    mode =
11fe0 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
11ff0 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73  mode(statePtr->s
12000 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64  sl);.    if (mod
12010 65 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e  e & SSL_VERIFY_N
12020 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f  ONE) {..LAPPEND_
12030 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12040 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22  tr, "verifyMode"
12050 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20  , "none", -1);. 
12060 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
12070 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72  _Obj *listObjPtr
12080 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
12090 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  j(0, NULL);..if 
120a0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49  (mode & SSL_VERI
120b0 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20  FY_PEER) {..    
120c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
120d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
120e0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
120f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
12100 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  eer", -1));..}..
12110 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56  if (mode & SSL_V
12120 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
12130 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20  _PEER_CERT) {.. 
12140 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12150 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12160 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
12170 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12180 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65  ("fail if no pee
12190 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09  r cert", -1));..
121a0 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53  }..if (mode & SS
121b0 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
121c0 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  ONCE) {..    Tcl
121d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
121e0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
121f0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
12200 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65  wStringObj("clie
12210 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a  nt once", -1));.
12220 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53  .}..if (mode & S
12230 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
12240 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
12250 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12260 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12270 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
12280 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12290 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
122a0 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
122b0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
122c0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
122d0 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
122e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
122f0 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
12300 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
12310 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12320 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
12330 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
12340 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
12350 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
12360 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
12370 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
12380 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
12390 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
123a0 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
123b0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
123c0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
123d0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
123e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
123f0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
12400 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
12410 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
12420 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
12430 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12440 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
12450 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
12460 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
12470 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
12480 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
12490 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
124a0 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
124b0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
124c0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
124d0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
124e0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
124f0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
12500 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
12510 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
12520 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
12530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12540 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
12550 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
12560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12570 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
12580 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
12590 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
125a0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 64 20 69  ..    /* Added i
125b0 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 61  n OpenSSL 1.1.1a
125c0 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
125d0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
125e0 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20   0x10101000L.   
125f0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
12600 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
12610 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
12620 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
12630 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
12640 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
12650 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
12660 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
12670 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
12680 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
12690 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
126a0 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
126b0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
126c0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70  r, "signatureTyp
126d0 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  e", OBJ_nid2ln(n
126e0 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  id), -1);.#endif
126f0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
12700 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
12710 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
12720 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
12730 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12770 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
12780 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
12790 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
127a0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
127b0 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
127c0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
127d0 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
127e0 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
127f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12830 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
12840 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
12850 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55  bjCmd(.    TCL_U
12860 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20  NUSED(void *),. 
12870 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
12880 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f  nterp,.    int o
12890 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  bjc,.    Tcl_Obj
128a0 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a   *const objv[]).
128b0 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
128c0 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
128d0 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
128e0 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20   mode on */.    
128f0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
12900 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
12910 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
12920 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
12930 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
12940 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
12950 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
12960 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
12970 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
12980 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
12990 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ion;.    const E
129a0 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20  VP_MD *md;..    
129b0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
129c0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
129d0 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
129e0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
129f0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
12a00 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
12a10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12a20 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
12a30 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
12a40 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
12a50 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
12a60 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
12a70 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
12a80 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
12a90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12aa0 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
12ab0 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
12ac0 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
12ad0 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
12ae0 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
12af0 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
12b00 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
12b10 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
12b20 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
12b30 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
12b40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12b50 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
12b60 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
12b70 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
12b80 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
12b90 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
12ba0 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  *)NULL);..Tcl_Se
12bb0 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
12bc0 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45  p, "TLS", "CONNE
12bd0 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c  CTION", "CHANNEL
12be0 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
12bf0 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
12c00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12c10 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74      }..    objPt
12c20 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
12c30 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
12c40 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
12c50 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74  info */.    stat
12c60 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
12c70 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
12c80 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
12c90 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74  ;.    ssl = stat
12ca0 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69  ePtr->ssl;.    i
12cb0 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
12cc0 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  {..const unsigne
12cd0 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 09  d char *proto;..
12ce0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
12cf0 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69  n;.../* Initiali
12d00 7a 61 74 69 6f 6e 20 66 69 6e 69 73 68 65 64 20  zation finished 
12d10 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
12d20 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12d30 20 22 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 22   "init_finished"
12d40 2c 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69  , SSL_is_init_fi
12d50 6e 69 73 68 65 64 28 73 73 6c 29 29 3b 0a 0a 09  nished(ssl));...
12d60 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  /* connection st
12d70 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ate */..LAPPEND_
12d80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12d90 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c  tr, "state", SSL
12da0 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f  _state_string_lo
12db0 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09  ng(ssl), -1);...
12dc0 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65  /* Get SNI reque
12dd0 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65  sted server name
12de0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
12df0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12e00 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53   "servername", S
12e10 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d  SL_get_servernam
12e20 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41  e(ssl, TLSEXT_NA
12e30 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
12e40 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 70  ), -1);.../* Rep
12e50 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
12e60 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
12e70 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67  esult of the neg
12e80 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c  otiation */..SSL
12e90 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63  _get0_alpn_selec
12ea0 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ted(statePtr->ss
12eb0 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e  l, &proto, &ulen
12ec0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12ed0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12ee0 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29  "alpn", (char *)
12ef0 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65  proto, (Tcl_Size
12f00 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 47 65  ) ulen);.../* Ge
12f10 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c  t protocol */..L
12f20 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12f30 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
12f40 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76  ocol", SSL_get_v
12f50 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29  ersion(ssl), -1)
12f60 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61  ;.../* Renegotia
12f70 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  tion allowed */.
12f80 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
12f90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
12fa0 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c  enegotiation_all
12fb0 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73  owed", SSL_get_s
12fc0 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74  ecure_renegotiat
12fd0 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c  ion_support((SSL
12fe0 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20   *) ssl));.../* 
12ff0 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76  Get security lev
13000 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49  el */..LAPPEND_I
13010 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
13020 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76  r, "security_lev
13030 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63  el", SSL_get_sec
13040 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29  urity_level(ssl)
13050 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
13060 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  info */..LAPPEND
13070 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
13080 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72  jPtr, "session_r
13090 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73  eused", SSL_sess
130a0 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29  ion_reused(ssl))
130b0 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72  ;.../* Is server
130c0 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
130d0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
130e0 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65  bjPtr, "is_serve
130f0 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65  r", SSL_is_serve
13100 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  r(ssl));.../* Is
13110 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e   DTLS */..LAPPEN
13120 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
13130 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22  bjPtr, "is_dtls"
13140 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73  , SSL_is_dtls(ss
13150 6c 29 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53  l));..#if OPENSS
13160 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
13170 20 3e 3d 20 30 78 33 30 32 30 30 30 30 30 4c 0a   >= 0x30200000L.
13180 09 2f 2a 20 49 73 20 51 55 49 43 20 2a 2f 0a 09  ./* Is QUIC */..
13190 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
131a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73  erp, objPtr, "is
131b0 5f 71 75 69 63 22 2c 20 53 53 4c 5f 69 73 5f 71  _quic", SSL_is_q
131c0 75 69 63 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  uic(ssl));.../* 
131d0 49 73 20 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45  Is TLS */..LAPPE
131e0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
131f0 6f 62 6a 50 74 72 2c 20 22 69 73 5f 74 6c 73 22  objPtr, "is_tls"
13200 2c 20 53 53 4c 5f 69 73 5f 74 6c 73 28 73 73 6c  , SSL_is_tls(ssl
13210 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ));.#endif.../* 
13220 44 41 4e 45 20 54 4c 53 20 61 75 74 68 65 6e 74  DANE TLS authent
13230 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50  ication */..LAPP
13240 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
13250 20 6f 62 6a 50 74 72 2c 20 22 64 61 6e 65 5f 61   objPtr, "dane_a
13260 75 74 68 22 2c 20 53 53 4c 5f 67 65 74 30 5f 64  uth", SSL_get0_d
13270 61 6e 65 28 28 53 53 4c 20 2a 29 73 73 6c 29 20  ane((SSL *)ssl) 
13280 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 57  != NULL);.../* W
13290 61 69 74 69 6e 67 20 66 6f 72 20 61 73 79 6e 63  aiting for async
132a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
132b0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
132c0 2c 20 22 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61  , "waiting_for_a
132d0 73 79 6e 63 22 2c 20 53 53 4c 5f 77 61 69 74 69  sync", SSL_waiti
132e0 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 28 28 53 53  ng_for_async((SS
132f0 4c 20 2a 29 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  L *)ssl));.../* 
13300 54 69 6d 65 2d 6f 75 74 20 2a 2f 0a 09 4c 41 50  Time-out */..LAP
13310 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70  PEND_LONG(interp
13320 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 2d  , objPtr, "time-
13330 6f 75 74 22 2c 20 53 53 4c 5f 67 65 74 5f 64 65  out", SSL_get_de
13340 66 61 75 6c 74 5f 74 69 6d 65 6f 75 74 28 73 73  fault_timeout(ss
13350 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 43 65 72  l));.../* Is Cer
13360 74 69 66 69 63 61 74 65 20 54 72 61 6e 73 70 61  tificate Transpa
13370 72 65 6e 63 79 20 76 61 6c 69 64 61 74 69 6f 6e  rency validation
13380 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 09 4c 41 50   enabled */..LAP
13390 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
133a0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 74 5f 65 6e  , objPtr, "ct_en
133b0 61 62 6c 65 64 22 2c 20 53 53 4c 5f 63 74 5f 69  abled", SSL_ct_i
133c0 73 5f 65 6e 61 62 6c 65 64 28 73 73 6c 29 29 3b  s_enabled(ssl));
133d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
133e0 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20  ipher info */.  
133f0 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67    cipher = SSL_g
13400 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65  et_current_ciphe
13410 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  r(ssl);.    if (
13420 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20  cipher != NULL) 
13430 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53  {..char buf[BUFS
13440 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20  IZ] = {0};..int 
13450 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a  bits, alg_bits;.
13460 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65  ../* Cipher name
13470 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
13480 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13490 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43   "cipher", SSL_C
134a0 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
134b0 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f  ipher), -1);.../
134c0 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69  * RFC name of ci
134d0 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  pher */..LAPPEND
134e0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
134f0 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e  Ptr, "standard_n
13500 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  ame", SSL_CIPHER
13510 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63  _standard_name(c
13520 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f  ipher), -1);.../
13530 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f  * OpenSSL name o
13540 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
13550 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
13560 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73   objPtr, "openss
13570 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c  l_name", OPENSSL
13580 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c  _cipher_name(SSL
13590 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
135a0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20  _name(cipher)), 
135b0 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72  -1);.../* number
135c0 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 73 20   of secret bits 
135d0 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 72 20  used for cipher 
135e0 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43  */..bits = SSL_C
135f0 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63  IPHER_get_bits(c
13600 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73  ipher, &alg_bits
13610 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  );..LAPPEND_INT(
13620 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13630 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62  "secret_bits", b
13640 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49  its);..LAPPEND_I
13650 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
13660 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69  r, "algorithm_bi
13670 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a  ts", alg_bits);.
13680 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20  ./* alg_bits is 
13690 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65  actual key secre
136a0 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62  t bits. If use b
136b0 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28  its and secret (
136c0 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20  algorithm) bits 
136d0 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20  differ,..   the 
136e0 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73  rest of the bits
136f0 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e   are fixed, i.e.
13700 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70   for limited exp
13710 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74  ort ciphers (bit
13720 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20  s < 56) */.../* 
13730 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 20  Indicates which 
13740 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c  SSL/TLS protocol
13750 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64   version first d
13760 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 68 65  efined the ciphe
13770 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
13780 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
13790 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c  , "min_version",
137a0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
137b0 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c  version(cipher),
137c0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65   -1);.../* Ciphe
137d0 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e  r NID */..LAPPEN
137e0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
137f0 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44  jPtr, "cipherNID
13800 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
13810 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
13820 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28  _get_cipher_nid(
13830 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09  cipher)), -1);..
13840 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
13850 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67  rp, objPtr, "dig
13860 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  estNID", (char *
13870 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
13880 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73  CIPHER_get_diges
13890 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  t_nid(cipher)), 
138a0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
138b0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
138c0 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49  , "keyExchangeNI
138d0 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
138e0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
138f0 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70  R_get_kx_nid(cip
13900 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
13910 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
13920 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e   objPtr, "authen
13930 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63  ticationNID", (c
13940 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
13950 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
13960 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29  auth_nid(cipher)
13970 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73  ), -1);.../* mes
13980 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74  sage authenticat
13990 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65  ion code - Ciphe
139a0 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20  r is AEAD (e.g. 
139b0 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f  GCM or ChaCha20/
139c0 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74  Poly1305) or not
139d0 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69   */../* Authenti
139e0 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e  cated Encryption
139f0 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64   with associated
13a00 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65   data (AEAD) che
13a10 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ck */..LAPPEND_B
13a20 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
13a30 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61  tr, "cipher_is_a
13a40 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  ead", SSL_CIPHER
13a50 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29  _is_aead(cipher)
13a60 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75  );.../* Digest u
13a70 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 53  sed during the S
13a80 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65  SL/TLS handshake
13a90 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20   when using the 
13aa0 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d  cipher. */..md =
13ab0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
13ac0 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74  handshake_digest
13ad0 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45  (cipher);..LAPPE
13ae0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
13af0 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b  bjPtr, "handshak
13b00 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 72  e_digest", (char
13b10 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d   *)EVP_MD_name(m
13b20 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  d), -1);.../* Ge
13b30 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66  t OpenSSL-specif
13b40 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20  ic ID, not IANA 
13b50 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49  ID */..LAPPEND_I
13b60 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
13b70 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20  r, "cipher_id", 
13b80 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52  (int) SSL_CIPHER
13b90 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29  _get_id(cipher))
13ba0 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20  ;.../* Two-byte 
13bb0 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 54  ID used in the T
13bc0 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74  LS protocol of t
13bd0 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 20  he given cipher 
13be0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  */..LAPPEND_INT(
13bf0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13c00 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28  "protocol_id", (
13c10 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f  int) SSL_CIPHER_
13c20 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28  get_protocol_id(
13c30 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54  cipher));.../* T
13c40 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
13c50 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
13c60 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50   */..if (SSL_CIP
13c70 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  HER_description(
13c80 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a  cipher, buf, siz
13c90 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c  eof(buf)) != NUL
13ca0 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e  L) {..    LAPPEN
13cb0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13cc0 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69  jPtr, "descripti
13cd0 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09  on", buf, -1);..
13ce0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
13cf0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  Session info */.
13d00 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53      session = SS
13d10 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73  L_get_session(ss
13d20 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73  l);.    if (sess
13d30 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ion != NULL) {..
13d40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13d50 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69  har *ticket;..si
13d60 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69  ze_t len2;..unsi
13d70 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09  gned int ulen;..
13d80 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13d90 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c  har *session_id,
13da0 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e   *proto;..unsign
13db0 65 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 53  ed char buffer[S
13dc0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
13dd0 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20  Y_LENGTH];.../* 
13de0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
13df0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
13e00 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
13e10 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e  ALPN negotiation
13e20 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e   */..SSL_SESSION
13e30 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63  _get0_alpn_selec
13e40 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72  ted(session, &pr
13e50 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  oto, &len2);..LA
13e60 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
13e70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22  , objPtr, "alpn"
13e80 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
13e90 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
13ea0 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20  2);.../* Report 
13eb0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
13ec0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
13ed0 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67  t of the NPN neg
13ee0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64  otiation */.#ifd
13ef0 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f  ef USE_NPN..SSL_
13f00 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f  get0_next_proto_
13f10 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20  negotiated(ssl, 
13f20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a  &proto, &ulen);.
13f30 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
13f40 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70  erp, objPtr, "np
13f50 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f  n", (char *) pro
13f60 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  to, (Tcl_Size) u
13f70 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f  len);.#endif.../
13f80 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73  * Resumable sess
13f90 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ion */..LAPPEND_
13fa0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
13fb0 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22  Ptr, "resumable"
13fc0 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73  , SSL_SESSION_is
13fd0 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69  _resumable(sessi
13fe0 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
13ff0 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73  on start time (s
14000 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f  econds since epo
14010 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ch) */..LAPPEND_
14020 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
14030 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65  Ptr, "start_time
14040 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
14050 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29  et_time(session)
14060 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20  );.../* Timeout 
14070 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f  value - SSL_CTX_
14080 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20  get_timeout (in 
14090 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50  seconds) */..LAP
140a0 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70  PEND_LONG(interp
140b0 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f  , objPtr, "timeo
140c0 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ut", SSL_SESSION
140d0 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73  _get_timeout(ses
140e0 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  sion));.../* Ses
140f0 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e  sion id - TLSv1.
14100 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79  2 and below only
14110 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20   */..session_id 
14120 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
14130 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75  t_id(session, &u
14140 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  len);..LAPPEND_B
14150 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
14160 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69  jPtr, "session_i
14170 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20  d", session_id, 
14180 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29  (Tcl_Size) ulen)
14190 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63  ;.../* Session c
141a0 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69  ontext */..sessi
141b0 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
141c0 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74  ION_get0_id_cont
141d0 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c  ext(session, &ul
141e0 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  en);..LAPPEND_BA
141f0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
14200 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f  Ptr, "session_co
14210 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f  ntext", session_
14220 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
14230 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  len);.../* Sessi
14240 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65  on ticket - clie
14250 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f  nt only */..SSL_
14260 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
14270 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ket(session, &ti
14280 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c  cket, &len2);..L
14290 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
142a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
142b0 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20  ession_ticket", 
142c0 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
142d0 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53  e) len2);.../* S
142e0 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69  ession ticket li
142f0 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20  fetime hint (in 
14300 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50  seconds) */..LAP
14310 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70  PEND_LONG(interp
14320 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74  , objPtr, "lifet
14330 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ime", SSL_SESSIO
14340 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66  N_get_ticket_lif
14350 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69  etime_hint(sessi
14360 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65  on));.../* Ticke
14370 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69  t app data */.#i
14380 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
14390 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
143a0 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53  00000L..SSL_SESS
143b0 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f  ION_get0_ticket_
143c0 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53  appdata((SSL_SES
143d0 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c  SION *) session,
143e0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
143f0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
14400 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
14410 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61  , "ticket_app_da
14420 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63  ta", ticket, (Tc
14430 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23  l_Size) len2);.#
14440 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d  endif.../* Get m
14450 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65  aster key */..le
14460 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  n2 = SSL_SESSION
14470 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28  _get_master_key(
14480 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c  session, buffer,
14490 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f   SSL_MAX_MASTER_
144a0 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41  KEY_LENGTH);..LA
144b0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
144c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61  erp, objPtr, "ma
144d0 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65  ster_key", buffe
144e0 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  r, (Tcl_Size) le
144f0 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65  n2);.../* Compre
14500 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73  ssion id */..uns
14510 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53  igned int id = S
14520 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63  SL_SESSION_get_c
14530 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69  ompress_id(sessi
14540 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  on);..LAPPEND_ST
14550 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
14560 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69  , "compression_i
14570 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a  d", id == 1 ? "z
14580 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d  lib" : "none", -
14590 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
145a0 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e  * Compression in
145b0 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73  fo */.    if (ss
145c0 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66  l != NULL) {.#if
145d0 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d  def HAVE_SSL_COM
145e0 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20  PRESSION..const 
145f0 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d  COMP_METHOD *com
14600 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20  p, *expn;..comp 
14610 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
14620 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73  t_compression(ss
14630 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f  l);..expn = SSL_
14640 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61  get_current_expa
14650 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41  nsion(ssl);...LA
14660 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
14670 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
14680 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20  ession", comp ? 
14690 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
146a0 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22  e(comp) : "none"
146b0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
146c0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
146d0 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c  tr, "expansion",
146e0 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50   expn ? SSL_COMP
146f0 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20  _get_name(expn) 
14700 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23  : "none", -1);.#
14710 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54  else..LAPPEND_ST
14720 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
14730 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  , "compression",
14740 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c   "none", -1);..L
14750 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
14760 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61  p, objPtr, "expa
14770 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20  nsion", "none", 
14780 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  -1);.#endif.    
14790 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72  }..    /* Server
147a0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09   info */.    {..
147b0 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  long mode = SSL_
147c0 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f  CTX_get_session_
147d0 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65  cache_mode(state
147e0 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72  Ptr->ctx);..char
147f0 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64   *msg;...if (mod
14800 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
14810 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d  HE_OFF) {..    m
14820 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65  sg = "off";..} e
14830 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
14840 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
14850 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67  IENT) {..    msg
14860 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20   = "client";..} 
14870 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
14880 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53  SSL_SESS_CACHE_S
14890 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73  ERVER) {..    ms
148a0 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d  g = "server";..}
148b0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
148c0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
148d0 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67  BOTH) {..    msg
148e0 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c   = "both";..} el
148f0 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  se {..    msg = 
14900 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c  "unknown";..}..L
14910 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
14920 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
14930 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c  ion_cache_mode",
14940 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d   msg, -1);.    }
14950 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74  ..    /* CA List
14960 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f   */.    /* IF no
14970 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65  t a server, same
14980 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65   as SSL_get0_pee
14990 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65  r_CA_list. If se
149a0 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c  rver same as SSL
149b0 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_get_client_
149c0 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c  CA_list */.    l
149d0 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  istPtr = Tcl_New
149e0 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
149f0 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58  ;.    STACK_OF(X
14a00 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69  509_NAME) *ca_li
14a10 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f  st;.    if ((ca_
14a20 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63  list = SSL_get_c
14a30 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73  lient_CA_list(ss
14a40 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  l)) != NULL) {..
14a50 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53  char buffer[BUFS
14a60 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69  IZ];..for (int i
14a70 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30   = 0; i < sk_X50
14a80 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69  9_NAME_num(ca_li
14a90 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  st); i++) {..   
14aa0 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65   X509_NAME *name
14ab0 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   = sk_X509_NAME_
14ac0 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69  value(ca_list, i
14ad0 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65  );..    if (name
14ae0 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  ) {...X509_NAME_
14af0 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75  oneline(name, bu
14b00 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09  ffer, BUFSIZ);..
14b10 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
14b20 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14b30 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e  , listPtr, Tcl_N
14b40 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66  ewStringObj(buff
14b50 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d  er, -1));..    }
14b60 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41  ..}.    }.    LA
14b70 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
14b80 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73  , objPtr, "caLis
14b90 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20  t", listPtr);.  
14ba0 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
14bb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
14bc0 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f  aListCount", sk_
14bd0 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61  X509_NAME_num(ca
14be0 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63  _list));..    Tc
14bf0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
14c00 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
14c10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
14c20 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
14c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14c70 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a   *. * VersionObj
14c80 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65  Cmd -- return ve
14c90 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f  rsion string fro
14ca0 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
14cb0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
14cc0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
14cd0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
14ce0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
14cf0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
14d40 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e  atic int.Version
14d50 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
14d60 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
14d70 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
14d80 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 43 4c 5f  interp,.    TCL_
14d90 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a 20 6f  UNUSED(int) /* o
14da0 62 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f  bjc */,.    TCL_
14db0 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a 20 2a  UNUSED(Tcl_Obj *
14dc0 63 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 6a 76  const *) /* objv
14dd0 20 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f   */).{.    Tcl_O
14de0 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20  bj *objPtr;..   
14df0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
14e00 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
14e10 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
14e20 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
14e30 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a 20  ON_TEXT, -1);.. 
14e40 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
14e50 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
14e60 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
14e70 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
14e80 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ec0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f  ----. *. * MiscO
14ed0 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f  bjCmd -- misc co
14ee0 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73  mmands. *. * Res
14ef0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
14f00 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
14f10 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
14f20 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
14f30 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f70 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
14f80 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28   int.MiscObjCmd(
14f90 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
14fa0 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c  void *),.    Tcl
14fb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14fc0 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
14fd0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
14fe0 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20  t objv[]).{.    
14ff0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
15000 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d  r *commands [] =
15010 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65   { "req", "strre
15020 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20  q", NULL };.    
15030 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43  enum command { C
15040 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20  _REQ, C_STRREQ, 
15050 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54  C_DUMMY };.    T
15060 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20  cl_Size cmd;.   
15070 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20   int isStr;.    
15080 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38  char buffer[1638
15090 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  4];..    dprintf
150a0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
150b0 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b   if (objc < 2) {
150c0 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
150d0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
150e0 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20  jv, "subcommand 
150f0 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72  ?args?");..retur
15100 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15110 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47   }.    if (Tcl_G
15120 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
15130 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
15140 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61  commands, "comma
15150 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d  nd", 0, &cmd) !=
15160 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
15170 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15180 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
15190 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
151a0 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d   isStr = (cmd ==
151b0 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20   C_STRREQ);.    
151c0 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f  switch ((enum co
151d0 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63  mmand) cmd) {..c
151e0 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65  ase C_REQ:..case
151f0 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20   C_STRREQ: {..  
15200 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79    EVP_PKEY *pkey
15210 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
15220 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20   *cert=NULL;..  
15230 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d    X509_NAME *nam
15240 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c  e=NULL;..    Tcl
15250 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20  _Obj **listv;.. 
15260 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74     Tcl_Size list
15270 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  c,i;...    BIO *
15280 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
15290 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43 3d  const char *k_C=
152a0 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c  "",*k_ST="",*k_L
152b0 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f  ="",*k_O="",*k_O
152c0 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b  U="",*k_CN="",*k
152d0 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20  _Email="";..    
152e0 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65  char *keyout,*pe
152f0 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20  mout,*str;..    
15300 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69  int keysize,seri
15310 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a  al=0,days=365;..
15320 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
15330 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
15340 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49  0000000L..    BI
15350 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c  GNUM *bne = NULL
15360 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20  ;..    RSA *rsa 
15370 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20  = NULL;.#else.. 
15380 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20     EVP_PKEY_CTX 
15390 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e  *ctx = NULL;.#en
153a0 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f  dif...    if ((o
153b0 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e  bjc<5) || (objc>
153c0 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e  6)) {...Tcl_Wron
153d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
153e0 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69   2, objv, "keysi
153f0 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66  ze keyfile certf
15400 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09  ile ?info?");...
15410 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15420 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
15430 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
15440 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15450 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20  v[2], &keysize) 
15460 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72  != TCL_OK) {...r
15470 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15480 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79  ..    }..    key
15490 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
154a0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20  g(objv[3]);..   
154b0 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53   pemout=Tcl_GetS
154c0 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
154d0 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20  .    if (isStr) 
154e0 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69  {...Tcl_SetVar(i
154f0 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c  nterp,keyout,"",
15500 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  0);...Tcl_SetVar
15510 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22  (interp,pemout,"
15520 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  ",0);..    }... 
15530 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20     if (objc>=6) 
15540 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  {...if (Tcl_List
15550 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
15560 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20  nterp, objv[5], 
15570 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20  &listc, &listv) 
15580 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20  != TCL_OK) {... 
15590 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
155a0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
155b0 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20  (listc%2) != 0) 
155c0 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
155d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e  esult(interp,"In
155e0 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d  formation list m
155f0 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75  ust have even nu
15600 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
15610 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  s",NULL);...    
15620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15630 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30  ;...}...for (i=0
15640 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29  ; i<listc; i+=2)
15650 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c   {...    str=Tcl
15660 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
15670 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28  [i]);...    if (
15680 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73  strcmp(str,"days
15690 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
156a0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
156b0 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
156c0 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f  +1],&days)!=TCL_
156d0 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
156e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
156f0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
15700 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c  rcmp(str,"serial
15710 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28  ")==0) {....if (
15720 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15730 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69  j(interp,listv[i
15740 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43  +1],&serial)!=TC
15750 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
15760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
15770 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
15780 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d  strcmp(str,"C")=
15790 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c  =0) {....k_C=Tcl
157a0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
157b0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
157c0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
157d0 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a  str,"ST")==0) {.
157e0 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53  ...k_ST=Tcl_GetS
157f0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
15800 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
15810 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
15820 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c  L")==0) {....k_L
15830 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
15840 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
15850 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
15860 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29  cmp(str,"O")==0)
15870 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65   {....k_O=Tcl_Ge
15880 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
15890 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
158a0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
158b0 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"OU")==0) {....
158c0 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_OU=Tcl_GetStri
158d0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
158e0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
158f0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22  (strcmp(str,"CN"
15900 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d  )==0) {....k_CN=
15910 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
15920 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
15930 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
15940 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d  mp(str,"Email")=
15950 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c  =0) {....k_Email
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 7b 0a 09 09 09 54 63    } else {....Tc
15990 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
159a0 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61  rp,"Unknown para
159b0 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09  meter",NULL);...
159c0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
159d0 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09  R;...    }...}..
159e0 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53      }..#if OPENS
159f0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
15a00 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
15a10 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65  .    bne = BN_ne
15a20 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20  w();..    rsa = 
15a30 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20  RSA_new();..    
15a40 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f  pkey = EVP_PKEY_
15a50 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28  new();..    if (
15a60 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72  bne == NULL || r
15a70 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b  sa == NULL || pk
15a80 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42  ey == NULL || !B
15a90 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52  N_set_word(bne,R
15aa0 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41  SA_F4) ||...!RSA
15ab0 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78  _generate_key_ex
15ac0 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62  (rsa, keysize, b
15ad0 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56  ne, NULL) || !EV
15ae0 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53  P_PKEY_assign_RS
15af0 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a  A(pkey, rsa)) {.
15b00 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
15b10 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f  pkey);.../* RSA_
15b20 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64  free(rsa); freed
15b30 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65   by EVP_PKEY_fre
15b40 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62  e */...BN_free(b
15b50 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ne);.#else..    
15b60 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67  pkey = EVP_RSA_g
15b70 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  en((unsigned int
15b80 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20  ) keysize);..   
15b90 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f   ctx = EVP_PKEY_
15ba0 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c  CTX_new(pkey,NUL
15bb0 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65  L);..    if (pke
15bc0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78  y == NULL || ctx
15bd0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50   == NULL || !EVP
15be0 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69  _PKEY_keygen_ini
15bf0 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50  t(ctx) ||...!EVP
15c00 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73  _PKEY_CTX_set_rs
15c10 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74  a_keygen_bits(ct
15c20 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21  x, keysize) || !
15c30 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28  EVP_PKEY_keygen(
15c40 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09  ctx, &pkey)) {..
15c50 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
15c60 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  key);...EVP_PKEY
15c70 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
15c80 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74  #endif...Tcl_Set
15c90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
15ca0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
15cb0 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c  private key",NUL
15cc0 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  L);...return TCL
15cd0 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65  _ERROR;..    } e
15ce0 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74  lse {...if (isSt
15cf0 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
15d00 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
15d10 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
15d20 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
15d30 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
15d40 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
15d50 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  LL);...    i=BIO
15d60 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
15d70 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
15d80 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
15d90 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
15da0 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
15db0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
15dc0 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c  r(interp,keyout,
15dd0 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
15de0 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
15df0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
15e00 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
15e10 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
15e20 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
15e30 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
15e40 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b  e_filename(out,k
15e50 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  eyout);...    PE
15e60 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
15e70 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
15e80 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
15e90 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a  ,NULL);...    /*
15ea0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52   PEM_write_bio_R
15eb0 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  SAPrivateKey(out
15ec0 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  , rsa, NULL, NUL
15ed0 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  L, 0, NULL, NULL
15ee0 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f  ); */...    BIO_
15ef0 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09  free_all(out);..
15f00 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74   .}....if ((cert
15f10 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55  =X509_new())==NU
15f20 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  LL) {...    Tcl_
15f30 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
15f40 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
15f50 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72  ng certificate r
15f60 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09  equest",NULL);..
15f70 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
15f80 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
15f90 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
15fa0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
15fb0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65  0L...    BN_free
15fc0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (bne);.#endif...
15fd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15fe0 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  RROR;...}....X50
15ff0 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65  9_set_version(ce
16000 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e  rt,2);...ASN1_IN
16010 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67  TEGER_set(X509_g
16020 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28  et_serialNumber(
16030 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09  cert),serial);..
16040 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
16050 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65  (X509_getm_notBe
16060 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09  fore(cert),0);..
16070 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
16080 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66  (X509_getm_notAf
16090 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29  ter(cert),(long)
160a0 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a  60*60*24*days);.
160b0 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65  ..X509_set_pubke
160c0 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09  y(cert,pkey);...
160d0 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73  .name=X509_get_s
160e0 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
160f0 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  );....X509_NAME_
16100 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
16110 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52  (name,"C", MBSTR
16120 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
16130 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
16140 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_C, -1, -1, 0)
16150 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
16160 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
16170 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49  ame,"ST", MBSTRI
16180 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
16190 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
161a0 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_ST, -1, -1, 0)
161b0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
161c0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
161d0 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e  ame,"L", MBSTRIN
161e0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
161f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
16200 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _L, -1, -1, 0);.
16210 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
16220 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
16230 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"O", MBSTRING_
16240 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
16250 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f  gned char *) k_O
16260 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
16270 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
16280 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
16290 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "OU", MBSTRING_A
162a0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
162b0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55  ned char *) k_OU
162c0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
162d0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
162e0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
162f0 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "CN", MBSTRING_A
16300 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
16310 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e  ned char *) k_CN
16320 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
16330 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
16340 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
16350 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e  "Email", MBSTRIN
16360 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
16370 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
16380 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20  _Email, -1, -1, 
16390 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f  0);....X509_set_
163a0 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
163b0 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28  t,name);....if (
163c0 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c  !X509_sign(cert,
163d0 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28  pkey,EVP_sha256(
163e0 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39  ))) {...    X509
163f0 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20  _free(cert);... 
16400 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
16410 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
16420 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
16430 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
16440 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
16450 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
16460 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
16470 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69  interp,"Error si
16480 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
16490 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  e",NULL);...    
164a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
164b0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53  ;...}....if (isS
164c0 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
164d0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
164e0 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
164f0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
16500 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
16510 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
16520 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
16530 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
16540 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
16550 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
16560 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
16570 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65  SetVar(interp,pe
16580 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  mout,buffer,0);.
16590 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
165a0 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
165b0 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
165c0 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
165d0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
165e0 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
165f0 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
16600 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20  out,pemout);... 
16610 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
16620 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
16630 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
16640 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09  all(out);...}...
16650 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29  .X509_free(cert)
16660 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  ;...EVP_PKEY_fre
16670 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
16680 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
16690 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
166a0 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  L...BN_free(bne)
166b0 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a  ;.#endif..    }.
166c0 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64  .}..break;.    d
166d0 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a  efault:..break;.
166e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
166f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a   TCL_OK;.}.../**
16700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16710 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20  **/./* Init     
16720 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
16730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16740 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
16750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
16790 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a  * Tls_Free --. *
167a0 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
167b0 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
167c0 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
167d0 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
167e0 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
167f0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
16800 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a  t falls below 1.
16810 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
16820 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
16830 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
16840 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
16850 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
16860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
168a0 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73  oid.Tls_Free(tls
168b0 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63  _free_type *bloc
168c0 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74  kPtr) {.    Stat
168d0 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
168e0 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b  tate *)blockPtr;
168f0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
16900 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c  alled");..    Tl
16910 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72  s_Clean(statePtr
16920 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c  );.    ckfree(bl
16930 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  ockPtr);.}.../*.
16940 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16980 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
16990 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54  Clean --. *. *.T
169a0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
169b0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
169c0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
169d0 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
169e0 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
169f0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
16a00 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69  ls below 1.  Thi
16a10 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63  s should. *.be c
16a20 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75  alled synchronou
16a30 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65  sly by the Close
16a40 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Proc, not in the
16a50 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72  . *.EventuallyFr
16a60 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  ee callback.. *.
16a70 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
16a80 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
16a90 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
16aa0 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
16ab0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16af0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
16b00 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65   Tls_Clean(State
16b10 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20   *statePtr) {.  
16b20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
16b30 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  d");..    /*.   
16b40 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69    * we're assumi
16b50 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27  ng here that we'
16b60 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  re single-thread
16b70 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed.     */.    i
16b80 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
16b90 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
16ba0 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
16bb0 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
16bc0 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
16bd0 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
16be0 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c  tr->timer = NULL
16bf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16c00 52 65 6d 6f 76 65 20 63 61 6c 6c 62 61 63 6b 73  Remove callbacks
16c10 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
16c20 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20  ePtr->callback) 
16c30 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
16c40 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61  unt(statePtr->ca
16c50 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50  llback);..stateP
16c60 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e  tr->callback = N
16c70 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
16c80 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  f (statePtr->pas
16c90 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65  sword) {..Tcl_De
16ca0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
16cb0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
16cc0 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  .statePtr->passw
16cd0 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ord = NULL;.    
16ce0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
16cf0 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c  tr->vcmd) {..Tcl
16d00 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _DecrRefCount(st
16d10 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
16d20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
16d30 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
16d40 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
16d50 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65  protos) {..ckfre
16d60 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  e(statePtr->prot
16d70 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  os);..statePtr->
16d80 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20  protos = NULL;. 
16d90 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
16da0 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09  atePtr->bio) {..
16db0 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c  /* This will cal
16dc0 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20  l SSL_shutdown. 
16dd0 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09  Bug 1414045 */..
16de0 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65  dprintf("BIO_fre
16df0 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74  e_all(%p)", stat
16e00 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f  ePtr->bio);..BIO
16e10 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50  _free_all(stateP
16e20 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65  tr->bio);..state
16e30 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b  Ptr->bio = NULL;
16e40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
16e50 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
16e60 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66  ..dprintf("SSL_f
16e70 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50  ree(%p)", stateP
16e80 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66  tr->ssl);..SSL_f
16e90 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ree(statePtr->ss
16ea0 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  l);..statePtr->s
16eb0 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  sl = NULL;.    }
16ec0 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
16ed0 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f  tr->ctx) {..SSL_
16ee0 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74  CTX_free(statePt
16ef0 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50  r->ctx);..stateP
16f00 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  tr->ctx = NULL;.
16f10 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
16f20 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
16f30 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
16f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f80 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66  . *. * Build Inf
16f90 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a  o Command --. *.
16fa0 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e   *.Create comman
16fb0 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c  d to return buil
16fc0 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61  d info for packa
16fd0 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ge.. *. * Result
16fe0 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
16ff0 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20   Tcl result. *. 
17000 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
17010 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64   *.Created build
17020 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20  -info command.. 
17030 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
17080 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46  #ifndef STRINGIF
17090 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  Y.#  define STRI
170a0 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49  NGIFY(x) STRINGI
170b0 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65  FY1(x).#  define
170c0 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23   STRINGIFY1(x) #
170d0 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75  x.#endif..int.Bu
170e0 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54  ildInfoCommand(T
170f0 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72  cl_Interp* inter
17100 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64  p) {.    Tcl_Cmd
17110 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20  Info info;..    
17120 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  if (Tcl_GetComma
17130 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22  ndInfo(interp, "
17140 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66  ::tcl::build-inf
17150 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54  o", &info)) {..T
17160 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
17170 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
17180 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c  ls::build-info",
17190 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28   info.objProc, (
171a0 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41  void *)(...PACKA
171b0 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53  GE_VERSION "+" S
171c0 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52  TRINGIFY(TLS_VER
171d0 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64  SION_UUID).#if d
171e0 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
171f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63  ) && defined(__c
17200 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09  lang_major__)...
17210 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53  .    ".clang-" S
17220 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67  TRINGIFY(__clang
17230 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f  _major__).#if __
17240 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20  clang_minor__ < 
17250 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65  10....    "0".#e
17260 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49  ndif....    STRI
17270 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69  NGIFY(__clang_mi
17280 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  nor__).#endif.#i
17290 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75  f defined(__cplu
172a0 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e  splus) && !defin
172b0 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09  ed(__OBJC__)....
172c0 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22      ".cplusplus"
172d0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
172e0 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e  NDEBUG....    ".
172f0 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69  debug".#endif.#i
17300 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  f !defined(__cla
17310 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  ng__) && !define
17320 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  d(__INTEL_COMPIL
17330 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  ER) && defined(_
17340 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20  _GNUC__)....    
17350 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46  ".gcc-" STRINGIF
17360 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20  Y(__GNUC__).#if 
17370 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c  __GNUC_MINOR__ <
17380 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23   10....    "0".#
17390 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52  endif....    STR
173a0 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49  INGIFY(__GNUC_MI
173b0 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  NOR__).#endif.#i
173c0 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d  fdef __INTEL_COM
173d0 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69  PILER....    ".i
173e0 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  cc-" STRINGIFY(_
173f0 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29  _INTEL_COMPILER)
17400 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54  .#endif.#ifdef T
17410 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09  CL_MEM_DEBUG....
17420 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a      ".memdebug".
17430 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
17440 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09  ed(_MSC_VER)....
17450 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52      ".msvc-" STR
17460 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29  INGIFY(_MSC_VER)
17470 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55  .#endif.#ifdef U
17480 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20  SE_NMAKE....    
17490 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a  ".nmake".#endif.
174a0 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f  #ifndef TCL_CFG_
174b0 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20  OPTIMIZED....   
174c0 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a   ".no-optimize".
174d0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
174e0 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e  OBJC__....    ".
174f0 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66  objective-c".#if
17500 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73   defined(__cplus
17510 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c  plus)....    "pl
17520 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23  usplus".#endif.#
17530 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c  endif.#ifdef TCL
17540 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09  _CFG_PROFILED...
17550 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a  .    ".profile".
17560 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55  #endif.#ifdef PU
17570 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75  RIFY....    ".pu
17580 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66  rify".#endif.#if
17590 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44  def STATIC_BUILD
175a0 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63  ....    ".static
175b0 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55  ".#endif...), NU
175c0 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  LL);.    }.    r
175d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
175e0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
175f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
17620 2a 0a 20 2a 20 54 6c 73 4c 69 62 53 68 75 74 64  *. * TlsLibShutd
17630 6f 77 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68 75  own --. *. *.Shu
17640 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 72  tdown SSL librar
17650 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69  y once per appli
17660 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73  cation. *. * Res
17670 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
17680 61 72 64 20 54 43 4c 20 72 65 73 75 6c 74 0a 20  ard TCL result. 
17690 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
176a0 73 3a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53  s:. *.Shutdown S
176b0 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a  SL library. *. *
176c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176f0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 76 6f 69 64  ------*. */.void
17700 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 28   TlsLibShutdown(
17710 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
17720 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ) {.    dprintf(
17730 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
17740 42 49 4f 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 7d  BIO_cleanup();.}
17750 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
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 2a 0a 20  -------------*. 
17790 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20  *. *.TlsLibInit 
177a0 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  --. *. *.Initial
177b0 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
177c0 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63   once per applic
177d0 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75  ation. *. * Resu
177e0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
177f0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a  rd Tcl result. *
17800 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
17810 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  :. *.Initializes
17820 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a   SSL library. *.
17830 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
17840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17860 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
17870 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
17880 6e 69 74 28 29 20 7b 0a 20 20 20 20 73 74 61 74  nit() {.    stat
17890 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
178a0 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ed = 0;..    dpr
178b0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
178c0 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61  .    if (!initia
178d0 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49 6e 69  lized) {../* Ini
178e0 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
178f0 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
17900 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50 45 4e  l. */..if (!OPEN
17910 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45  SSL_init_ssl(OPE
17920 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53  NSSL_INIT_LOAD_S
17930 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45  SL_STRINGS | OPE
17940 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43  NSSL_INIT_LOAD_C
17950 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 20  RYPTO_STRINGS.. 
17960 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49     | OPENSSL_INI
17970 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52  T_ADD_ALL_CIPHER
17980 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  S | OPENSSL_INIT
17990 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53  _ADD_ALL_DIGESTS
179a0 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f  ..    | OPENSSL_
179b0 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49 47  INIT_LOAD_CONFIG
179c0 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
179d0 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b 0a  ASYNC, NULL)) {.
179e0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
179f0 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  ERROR;..}.../* C
17a00 72 65 61 74 65 20 42 49 4f 20 68 61 6e 64 6c 65  reate BIO handle
17a10 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f 74  rs */..BIO_new_t
17a20 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 2f  cl(NULL, 0);.../
17a30 2a 20 43 72 65 61 74 65 20 65 78 69 74 20 68 61  * Create exit ha
17a40 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c 5f 43 72  ndler */..Tcl_Cr
17a50 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65 72 28  eateExitHandler(
17a60 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 2c 20  TlsLibShutdown, 
17a70 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69 61 6c 69  NULL);..initiali
17a80 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  zed = 1;.    }. 
17a90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
17aa0 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73 63  ;.}.../* Init sc
17ab0 72 69 70 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ript */.static c
17ac0 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
17ad0 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
17ae0 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
17af0 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d  cl.h".};../*. *-
17b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b40 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69  --. *. * Tls_Ini
17b50 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
17b60 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69  is a package ini
17b70 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
17b80 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73 20  edure, which is 
17b90 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 43 4c  called. *.by TCL
17ba0 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61   when this packa
17bb0 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64 65  ge is to be adde
17bc0 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65  d to an interpre
17bd0 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
17be0 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  ts:. *.Initializ
17bf0 65 73 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  es structures an
17c00 64 20 63 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e  d creates comman
17c10 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ds.. *. * Side e
17c20 66 66 65 63 74 73 3a 0a 20 2a 09 20 43 72 65 61  ffects:. *. Crea
17c30 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 0a  te the commands.
17c40 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
17c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c80 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69  --------. */..#i
17c90 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
17ca0 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20  ION > 8.#define 
17cb0 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30  MIN_VERSION "9.0
17cc0 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ".#else.#define 
17cd0 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35  MIN_VERSION "8.5
17ce0 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 45 58 50  ".#endif..DLLEXP
17cf0 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74  ORT int Tls_Init
17d00 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17d10 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70 72 69  erp) {..    dpri
17d20 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
17d30 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  #ifdef USE_TCL_S
17d40 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c  TUBS.    if (Tcl
17d50 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
17d60 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20  p, MIN_VERSION, 
17d70 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  0) == NULL) {..r
17d80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17d90 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
17da0 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75   if (Tcl_PkgRequ
17db0 69 72 65 45 78 28 69 6e 74 65 72 70 2c 20 22 54  ireEx(interp, "T
17dc0 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e  cl", MIN_VERSION
17dd0 2c 20 30 2c 20 4e 55 4c 4c 29 20 3d 3d 20 4e 55  , 0, NULL) == NU
17de0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
17df0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
17e00 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 54  endif..    if (T
17e10 6c 73 4c 69 62 49 6e 69 74 28 29 20 21 3d 20 54  lsLibInit() != T
17e20 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70  CL_OK) {..Tcl_Ap
17e30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17e40 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e  p, "could not in
17e50 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62  itialize SSL lib
17e60 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 4e  rary", (char *)N
17e70 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
17e80 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
17e90 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
17ea0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
17eb0 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73   "::tls::ciphers
17ec0 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
17ed0 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c  , (void *) NULL,
17ee0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
17ef0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
17f00 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
17f10 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
17f20 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ::tls::connectio
17f30 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
17f40 66 6f 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20  foObjCmd, (void 
17f50 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  *) NULL, (Tcl_Cm
17f60 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
17f70 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
17f80 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17f90 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68  nterp, "::tls::h
17fa0 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73  andshake", Hands
17fb0 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 76 6f 69  hakeObjCmd, (voi
17fc0 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  d *) NULL, (Tcl_
17fd0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
17fe0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
17ff0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
18000 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
18010 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74  :import", Import
18020 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29  ObjCmd, (void *)
18030 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
18040 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
18050 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
18060 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
18070 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69  erp, "::tls::uni
18080 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74  mport", Unimport
18090 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29  ObjCmd, (void *)
180a0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
180b0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
180c0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
180d0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
180e0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73  erp, "::tls::uns
180f0 74 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72 74 4f  tack", UnimportO
18100 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20  bjCmd, (void *) 
18110 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
18120 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
18130 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
18140 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
18150 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74  rp, "::tls::stat
18160 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
18170 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c  d, (void *) NULL
18180 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
18190 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
181a0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
181b0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
181c0 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22  "::tls::version"
181d0 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c  , VersionObjCmd,
181e0 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20   (void *) NULL, 
181f0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
18200 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
18210 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
18220 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
18230 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73  :tls::misc", Mis
18240 63 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a  cObjCmd, (void *
18250 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
18260 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
18270 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
18280 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
18290 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72  terp, "::tls::pr
182a0 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63  otocols", Protoc
182b0 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64  olsObjCmd, (void
182c0 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43   *) NULL, (Tcl_C
182d0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
182e0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c  NULL);..    Buil
182f0 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74  dInfoCommand(int
18300 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69  erp);..    if (i
18310 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61  nterp && Tcl_Eva
18320 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c  l(interp, tlsTcl
18330 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54  InitScript) != T
18340 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
18350 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18360 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  }..    return Tc
18370 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
18380 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d  erp, PACKAGE_NAM
18390 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  E, PACKAGE_VERSI
183a0 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ON);.}../*. *---
183b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
183c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
183d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
183e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
183f0 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49  . *. *.Tls_SafeI
18400 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  nit --. *. *.Thi
18410 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69  s is a package i
18420 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
18430 6f 63 65 64 75 72 65 20 66 6f 72 20 73 61 66 65  ocedure for safe
18440 20 69 6e 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20   interps.. *. * 
18450 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65  Results:. *.Same
18460 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74   as of 'Tls_Init
18470 27 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  '. *. * Side eff
18480 65 63 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73  ects:. *.Same as
18490 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20   of 'Tls_Init'. 
184a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
184b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
184c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
184d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
184e0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45  -------. */.DLLE
184f0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61  XPORT int Tls_Sa
18500 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
18510 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
18520 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
18530 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
18540 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ls_Init(interp);
18550 0a 7d 0a                                         .}.