Hex Artifact Content

Artifact 3dad396c4f647e5c29882a28b8241e7993d220048fa881ce71893c4bdb2e2ca1:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 22 74 6c 73 55 75 69 64 2e  nclude "tlsUuid.
0390: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h".#include <ope
03a0: 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e 63  nssl/rsa.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61  lude <openssl/sa
03c0: 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d  festack.h>../* M
03d0: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69  in OpenSSL versi
03e0: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  on */.#if OPENSS
03f0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
0400: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23   < 0x10101000L.#
0410: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e  error "Only Open
0420: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61  SSL v1.1.1 or la
0430: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  ter is supported
0440: 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 2a  ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69  tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29  ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e   \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 4e  ULL) ? (char *)N
04a0: 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72  ULL : \...Tcl_Tr
04b0: 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28  anslateFileName(
04c0: 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 28  interp, (key), (
04d0: 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20 53  dsp)))..static S
04e0: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74  SL_CTX *CTX_Init
04f0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
0500: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20  , int isServer, 
0510: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20  int proto, char 
0520: 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65  *key,...char *ce
0530: 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  rtfile, unsigned
0540: 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c   char *key_asn1,
0550: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0560: 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74  cert_asn1,...int
0570: 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69   key_asn1_len, i
0580: 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e  nt cert_asn1_len
0590: 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 20  , char *CApath, 
05a0: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09  char *CAfile,...
05b0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
05c0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
05d0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
05e0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
05f0: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69  static int.TlsLi
0600: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
0610: 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e  ialize);..#defin
0620: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
0630: 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54  ..0x01.#define T
0640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30  LS_PROTO_SSL3..0
0650: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x02.#define TLS_
0660: 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34  PROTO_TLS1..0x04
0670: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0680: 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23  TO_TLS1_1.0x08.#
0690: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
06a0: 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65  _TLS1_2.0x10.#de
06b0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
06c0: 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69  LS1_3.0x20.#defi
06d0: 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c  ne ENABLED(flag,
06e0: 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20   mask).(((flag) 
06f0: 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61  & (mask)) == (ma
0700: 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53 53  sk))..#define SS
0710: 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53 53  LKEYLOGFILE.."SS
0720: 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a  LKEYLOGFILE"../*
0730: 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 65 20  . * Thread-Safe 
0740: 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69  TLS Code. */..#i
0750: 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53  fdef TCL_THREADS
0760: 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c  .#define OPENSSL
0770: 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 53 0a  _THREAD_DEFINES.
0780: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0790: 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e  l/opensslconf.h>
07a0: 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  ..#ifdef OPENSSL
07b0: 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75 64  _THREADS.#includ
07c0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74  e <openssl/crypt
07d0: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  o.h>.#include <o
07e0: 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f  penssl/ssl.h>../
07f0: 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f 70  *. * Threaded op
0800: 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73  eration requires
0810: 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63   locking callbac
0820: 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f 6d  ks. * Based from
0830: 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c 69   /crypto/cryptli
0840: 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61  b.c of OpenSSL a
0850: 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a  nd NSOpenSSL.. *
0860: 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75  /..static Tcl_Mu
0870: 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c  tex *locks = NUL
0880: 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  L;.static int lo
0890: 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 74  cksCount = 0;.st
08a0: 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 69  atic Tcl_Mutex i
08b0: 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 20 2f  nit_mx;.#endif /
08c0: 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  * OPENSSL_THREAD
08d0: 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 54  S */.#endif /* T
08e0: 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 0c  CL_THREADS */...
08f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
0900: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62  ******/./* Callb
0910: 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f  acks        */./
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0930: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 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 0a  ---------------.
0980: 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62   *. * Eval Callb
0990: 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20  ack Command --. 
09a0: 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61  *. *.Eval callba
09b0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63  ck command and c
09c0: 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 0a  atch any errors.
09d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
09e0: 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65  *.0 = Command re
09f0: 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 65  turned fail or e
0a00: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
0a10: 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f  _ERROR. *.1 = Co
0a20: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 73  mmand returned s
0a30: 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 72  uccess or eval r
0a40: 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20  eturned TCL_OK. 
0a50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0a60: 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 20  s:. *.Evaluates 
0a70: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
0a80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
0ad0: 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c  atic int.EvalCal
0ae0: 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70  lback(Tcl_Interp
0af0: 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 20   *interp, State 
0b00: 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f  *statePtr, Tcl_O
0b10: 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20  bj *cmdPtr) {.  
0b20: 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d    int code, ok =
0b30: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
0b40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
0b50: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76   Tcl_Preserve((v
0b60: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a  oid *) interp);.
0b70: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
0b80: 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50  ((void *) stateP
0b90: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  tr);..    /* Eva
0ba0: 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l callback with 
0bb0: 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f  success for ok o
0bc0: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31  r return value 1
0bd0: 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72  , fail for error
0be0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65   or return value
0bf0: 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65   0 */.    Tcl_Re
0c00: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0c10: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
0c20: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
0c30: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
0c40: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
0c50: 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43    dprintf("EvalC
0c60: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f  allback: %d", co
0c70: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  de);.    if (cod
0c80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
0c90: 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20  /* Check result 
0ca0: 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  for return value
0cb0: 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65   */..Tcl_Obj *re
0cc0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
0cd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
0ce0: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20  ..if (result == 
0cf0: 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49  NULL || Tcl_GetI
0d00: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
0d10: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21  , result, &ok) !
0d20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
0d30: 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72   ok = 1;..}..dpr
0d40: 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64  intf("Result: %d
0d50: 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c  ", ok);.    } el
0d60: 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d  se {../* Error -
0d70: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74   reject the cert
0d80: 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69  ificate */..dpri
0d90: 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f  ntf("Tcl_Backgro
0da0: 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20  undError");.#if 
0db0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
0dc0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
0dd0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
0de0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
0df0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
0e00: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
0e10: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
0e20: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
0e30: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
0e40: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76    Tcl_Release((v
0e50: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29  oid *) statePtr)
0e60: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
0e70: 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72  e((void *) inter
0e80: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  p);.    return o
0e90: 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  k;.}.../*. *----
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0ee0: 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61   *. * InfoCallba
0ef0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
0f00: 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74  tors SSL connect
0f10: 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20  ion process. *. 
0f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
0f30: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
0f40: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
0f50: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
0f60: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0fb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49  */.static void.I
0fc0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  nfoCallback(cons
0fd0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  t SSL *ssl, int 
0fe0: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a  where, int ret).
0ff0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
1000: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
1010: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
1020: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20  ((SSL *)ssl);.  
1030: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1040: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
1050: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
1060: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
1070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61    const char *ma
1080: 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20  jor, *minor;..  
1090: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
10a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
10b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
10c0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
10d0: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
10e0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
10f0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53  L_CB_HANDSHAKE_S
1100: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  TART) {..major =
1110: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1120: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a  inor = "start";.
1130: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77      } else if (w
1140: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41  here & SSL_CB_HA
1150: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a  NDSHAKE_DONE) {.
1160: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1170: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1180: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73  done";.    } els
1190: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26  e {..if (where &
11a0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09   SSL_CB_ALERT)..
11b0: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b  major = "alert";
11c0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
11d0: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43   & SSL_ST_CONNEC
11e0: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e  T).major = "conn
11f0: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ect";..else if (
1200: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41  where & SSL_ST_A
1210: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20  CCEPT)..major = 
1220: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09  "accept";..else.
1230: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b  ....major = "unk
1240: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65  nown";...if (whe
1250: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44  re & SSL_CB_READ
1260: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64  )..minor = "read
1270: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1280: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54  re & SSL_CB_WRIT
1290: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69  E)..minor = "wri
12a0: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  te";..else if (w
12b0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f  here & SSL_CB_LO
12c0: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f  OP)..minor = "lo
12d0: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  op";..else if (w
12e0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58  here & SSL_CB_EX
12f0: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78  IT)..minor = "ex
1300: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  it";..else.....m
1310: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  inor = "unknown"
1320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1330: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1340: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1350: 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e  chan, major, min
1360: 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64  or, message, and
1370: 20 74 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20   type args */.  
1380: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1390: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
13a0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
13b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13f0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
1400: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1410: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1420: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1430: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1440: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1450: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1460: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1470: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1480: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1490: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
14a0: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
14b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14f0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
1500: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
1510: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1520: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1540: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1550: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1560: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1570: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1580: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1590: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
15a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
15b0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15c0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15d0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15e0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
1600: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1610: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1620: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1630: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1640: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1650: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1660: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1670: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1680: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1690: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
16a0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
16b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16f0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
1700: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
1710: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1720: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1730: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1790: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
17a0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
17b0: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17f0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
1800: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1860: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1870: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1880: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1890: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
18a0: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
18b0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18c0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18d0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18e0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
1900: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
1910: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1920: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1930: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1940: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1950: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1960: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1970: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1980: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1990: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
19a0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
19b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19c0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19d0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19e0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19f0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
1a00: 65 72 73 69 6f 6e 29 20 7b 0a 20 20 20 20 63 61  ersion) {.    ca
1a10: 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a  se TLS1_VERSION:
1a20: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b  ..ver = "TLSv1";
1a30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1a40: 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e  e TLS1_1_VERSION
1a50: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1a60: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  1";..break;.    
1a70: 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53  case TLS1_2_VERS
1a80: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1a90: 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.2";..break;. 
1aa0: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56     case TLS1_3_V
1ab0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1ac0: 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b  TLSv1.3";..break
1ad0: 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76  ;.    case 0:..v
1ae0: 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72  er = "none";..br
1af0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1b00: 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77  :..ver = "unknow
1b10: 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  n";..break;.    
1b20: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63  }..    switch (c
1b30: 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20  ontent_type) {. 
1b40: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1b50: 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20  HEADER:..type = 
1b60: 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b  "Header";..break
1b70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1b80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1b90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1ba0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1bb0: 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  pe";..break;.   
1bc0: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48   case SSL3_RT_CH
1bd0: 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43  ANGE_CIPHER_SPEC
1be0: 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67  :..type = "Chang
1bf0: 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61  e Cipher";..brea
1c00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1c10: 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65  _RT_ALERT:..type
1c20: 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65   = "Alert";..bre
1c30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1c40: 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a  3_RT_HANDSHAKE:.
1c50: 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61  .type = "Handsha
1c60: 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ke";..break;.   
1c70: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50   case SSL3_RT_AP
1c80: 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a  PLICATION_DATA:.
1c90: 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74  .type = "App Dat
1ca0: 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20  a";..break;.#if 
1cb0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
1cc0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
1cd0: 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54  000L.    case DT
1ce0: 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54  LS1_RT_HEARTBEAT
1cf0: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74  :..type = "Heart
1d00: 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  beat";..break;.#
1d10: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1d20: 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e  t:..type = "unkn
1d30: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1d40: 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c   /* Needs compil
1d50: 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65  e time option "e
1d60: 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22  nable-ssl-trace"
1d70: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69  . */.    if ((bi
1d80: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o = BIO_new(BIO_
1d90: 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c  s_mem())) != NUL
1da0: 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53  L) {..int n;..SS
1db0: 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c  L_trace(write_p,
1dc0: 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e   version, conten
1dd0: 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e  t_type, buf, len
1de0: 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62  , ssl, (void *)b
1df0: 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65  io);..n = BIO_re
1e00: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ad(bio, buffer, 
1e10: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1e20: 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70   < 15000 ? BIO_p
1e30: 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34  ending(bio) : 14
1e40: 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29  999);..n = (n<0)
1e50: 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65   ? 0 : n;..buffe
1e60: 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64  r[n] = 0;..(void
1e70: 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b  )BIO_flush(bio);
1e80: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b  ..BIO_free(bio);
1e90: 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72  .   }..    /* Cr
1ea0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
1eb0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
1ec0: 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76  an, direction, v
1ed0: 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e  ersion, type, an
1ee0: 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a  d message args *
1ef0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
1f00: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1f10: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
1f20: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
1f30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f40: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1f50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1f60: 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31  bj("message", -1
1f70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
1f80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1f90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1fa0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1fb0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
1fc0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
1fd0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
1fe0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1ff0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2000: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2010: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77  l_NewStringObj(w
2020: 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20  rite_p ? "Sent" 
2030: 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31  : "Received", -1
2040: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2050: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2060: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2070: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2080: 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20  j(ver, -1));.   
2090: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
20a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
20b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
20c0: 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c  wStringObj(type,
20d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
20e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
20f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2100: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2110: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
2120: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
2130: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
2140: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
2150: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2160: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
2170: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
2180: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
2190: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
21a0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65  nt(cmdPtr);.}.#e
21b0: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ndif.../*. *----
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2200: 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c   *. * VerifyCall
2210: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f  back --. *. *.Mo
2220: 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69  nitors SSL certi
2230: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
2240: 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20  n process. Used 
2250: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20  to control the. 
2260: 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20  *.behavior when 
2270: 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  the SSL_VERIFY_P
2280: 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e  EER flag is set.
2290: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a   This is called.
22a0: 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 65   *.whenever a ce
22b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e 73  rtificate is ins
22c0: 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 65  pected or decide
22d0: 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65  d invalid. Calle
22e0: 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65  d for. *.each ce
22f0: 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 65  rtificate in the
2300: 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a   cert chain.. *.
2310: 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68   * Checks:. *.Th
2320: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  e certificate ch
2330: 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73  ain is checked s
2340: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
2350: 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67   deepest nesting
2360: 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65   level. *.  (the
2370: 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69   root CA certifi
2380: 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64  cate) and worked
2390: 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70   upward to the p
23a0: 65 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74  eer's certificat
23b0: 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74  e.. *.All signat
23c0: 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20  ures are valid, 
23d0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20  current time is 
23e0: 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64  within first and
23f0: 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74   last validity t
2400: 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  ime.. *.Check th
2410: 61 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61  at the certifica
2420: 74 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20  te is issued by 
2430: 74 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69  the issuer certi
2440: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20  ficate issuer.. 
2450: 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f  *.Check the revo
2460: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f  cation status fo
2470: 72 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61  r each certifica
2480: 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  te.. *.Check the
2490: 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65   validity of the
24a0: 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74   given CRL and t
24b0: 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69  he cert revocati
24c0: 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68  on status.. *.Ch
24d0: 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73  eck the policies
24e0: 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74   of all the cert
24f0: 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41  ificates. *. * A
2500: 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79  rgs. *.preverify
2510: 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68  _ok indicates wh
2520: 65 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66  ether the certif
2530: 69 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69  icate verificati
2540: 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72  on passed (1) or
2550: 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52   not (0). *. * R
2560: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c  esults:. *.A cal
2570: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74  lback bound to t
2580: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65  he socket may re
2590: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09  turn one of:. *.
25a0: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65      0...- the ce
25b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
25c0: 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e  med invalid, sen
25d0: 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20  d verification. 
25e0: 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61  *....  failure a
25f0: 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e  lert to peer, an
2600: 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64  d terminate hand
2610: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09  shake.. *.    1.
2620: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63  ..- the certific
2630: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61  ate is deemed va
2640: 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69  lid, continue wi
2650: 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  th handshake.. *
2660: 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e  .    empty strin
2670: 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f  g.- no change to
2680: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c   certificate val
2690: 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69  idation. *. * Si
26a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
26b0: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
26c0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
26d0: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
26e0: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
26f0: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
2700: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
2710: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
2720: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2770: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69  .static int.Veri
2780: 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f  fyCallback(int o
2790: 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  k, X509_STORE_CT
27a0: 58 20 2a 63 74 78 29 0a 7b 0a 20 20 20 20 54 63  X *ctx).{.    Tc
27b0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
27c0: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d     SSL   *ssl..=
27d0: 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52   (SSL*)X509_STOR
27e0: 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74  E_CTX_get_ex_dat
27f0: 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65  a(ctx, SSL_get_e
2800: 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52  x_data_X509_STOR
2810: 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20  E_CTX_idx());.  
2820: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d    X509  *cert..=
2830: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
2840: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74  get_current_cert
2850: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65  (ctx);.    State
2860: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
2870: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
2880: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20  _data(ssl);.    
2890: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
28b0: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64  nterp;.    int d
28c0: 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f  epth..= X509_STO
28d0: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72  RE_CTX_get_error
28e0: 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20  _depth(ctx);.   
28f0: 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39   int err..= X509
2900: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
2910: 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20  rror(ctx);..    
2920: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
2930: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
2940: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2950: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69  %d", ok);..    i
2960: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
2970: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
2980: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f  ULL) {../* Use o
2990: 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66  k value if verif
29a0: 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  ication is requi
29b0: 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74  red */..if (stat
29c0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53  ePtr->vflags & S
29d0: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
29e0: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20  F_NO_PEER_CERT) 
29f0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b  {..    return ok
2a00: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
2a10: 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20   return 1;..}.  
2a20: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72    } else if (cer
2a30: 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c  t == NULL || ssl
2a40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
2a50: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
2a60: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66    dprintf("Verif
2a70: 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20  yCallback: eval 
2a80: 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20  callback");..   
2a90: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
2aa0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
2ab0: 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c  fn, chan, depth,
2ac0: 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c   cert info list,
2ad0: 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72   status, and err
2ae0: 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  or args */.    c
2af0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
2b00: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
2b10: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2b40: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2b50: 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22  ringObj("verify"
2b60: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2b80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2b90: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72  Ptr,..Tcl_NewStr
2ba0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
2bb0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
2bc0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
2bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2bf0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2c00: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74  l_NewIntObj(dept
2c10: 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  h));.    Tcl_Lis
2c20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c30: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2c40: 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  , Tls_NewX509Obj
2c50: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
2c60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2c70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2c80: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2c90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29  l_NewIntObj(ok))
2ca0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2cb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2cc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2cd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2ce0: 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72  ((char*)X509_ver
2cf0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
2d00: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
2d10: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e  ;..    /* Preven
2d20: 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c  t I/O while call
2d30: 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72  back is in progr
2d40: 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74  ess */.    /* st
2d50: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
2d60: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
2d70: 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76  K; */..    /* Ev
2d80: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
2d90: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
2da0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
2db0: 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76  tr);.    ok = Ev
2dc0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
2dd0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
2de0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
2df0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2e00: 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  r);..    dprintf
2e10: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2e20: 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74  : command result
2e30: 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20   = %d", ok);..  
2e40: 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66    /* statePtr->f
2e50: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43  lags &= ~(TLS_TC
2e60: 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a  L_CALLBACK); */.
2e70: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f      return ok;./
2e80: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65  * By default, le
2e90: 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ave verification
2ea0: 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d   unchanged. */.}
2eb0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2f00: 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20  * Tls_Error --. 
2f10: 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  *. *.Calls callb
2f20: 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d  ack with error m
2f30: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69  essage.. *. * Si
2f40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
2f50: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
2f60: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
2f70: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
2f80: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
2f90: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
2fa0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
2fb0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
2fc0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3010: 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28  .void.Tls_Error(
3020: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
3030: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20   char *msg) {.  
3040: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3050: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3060: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3070: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c  _Obj *cmdPtr, *l
3080: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69  istPtr;.    unsi
3090: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20  gned long err;. 
30a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
30b0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72   = msg;..    dpr
30c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
30d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
30e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
30f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
3100: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  return;..    /* 
3110: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3120: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
3130: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67  chan, and messag
3140: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3150: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3160: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3170: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
3180: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3190: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
31a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
31b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f  wStringObj("erro
31c0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
31d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
31e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
31f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
3200: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
3210: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
3220: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
3230: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d   -1));.    if (m
3240: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  sg != NULL) {..T
3250: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3260: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3270: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3280: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
3290: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
32a0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47  if ((msg = Tcl_G
32b0: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74  etString(Tcl_Get
32c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
32d0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
32e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
32f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3300: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3310: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3320: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3330: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3340: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3350: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
3360: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
3370: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
3380: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3390: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
33a0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
33b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
33c0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
33d0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
33e0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
33f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3410: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3420: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3430: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3440: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3450: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3460: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
3470: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
3480: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
3490: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
34a0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
34b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3500: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3510: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3520: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3530: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3540: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3550: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
35a0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
35b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
35c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
35d0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
35e0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
35f0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3600: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3610: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3620: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3630: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3640: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
3650: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
3660: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
3670: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
3680: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
36d0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
36e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
36f0: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3700: 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61   is needed for a
3710: 20 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65   private key whe
3720: 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20  n loading. *.or 
3730: 73 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65  storing a PEM ce
3740: 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65  rtificate with e
3750: 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73  ncryption. Evals
3760: 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72   callback. *.scr
3770: 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ipt and returns 
3780: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68  the result as th
3790: 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e  e password strin
37a0: 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20  g in buf.. *. * 
37b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
37c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
37d0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
37e0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
37f0: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
3800: 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73  s:. *.Password s
3810: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20  ize in bytes or 
3820: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  -1 for an error.
3830: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
3880: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72  atic int.Passwor
3890: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a  dCallback(char *
38a0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69  buf, int size, i
38b0: 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20  nt rwflag, void 
38c0: 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74  *udata) {.    St
38d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20  ate *statePtr.= 
38e0: 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b  (State *) udata;
38f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
3900: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
3910: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
3920: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
3930: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
3940: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b     Tcl_Size len;
3950: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
3960: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
3970: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c   If no callback,
3980: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c   use default cal
3990: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20  lback */.    if 
39a0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
39b0: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ord == NULL) {..
39c0: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69  if (Tcl_EvalEx(i
39d0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73  nterp, "tls::pas
39e0: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f  sword", -1, TCL_
39f0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20  EVAL_GLOBAL) == 
3a00: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63  TCL_OK) {..    c
3a10: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
3a20: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
3a30: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74  gFromObj(Tcl_Get
3a40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3a50: 29 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69  ), &len);..    i
3a60: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69  f (len > (Tcl_Si
3a70: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09  ze) size-1) {...
3a80: 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29  len = (Tcl_Size)
3a90: 20 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a   size-1;..    }.
3aa0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
3ab0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
3ac0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c  len);..    buf[l
3ad0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20  en] = '\0';..   
3ae0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65   return (int) le
3af0: 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  n;..} else {..  
3b00: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
3b10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3b20: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3b30: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77  eval with fn, rw
3b40: 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61  flag, and size a
3b50: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
3b60: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3b70: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70  eObj(statePtr->p
3b80: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63  assword);.    Tc
3b90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3ba0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3bb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3bc0: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72  ringObj("passwor
3bd0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  d", -1));.    Tc
3be0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3bf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3c00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3c10: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20  tObj(rwflag));. 
3c20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3c30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3c50: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29  NewIntObj(size))
3c60: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
3c70: 72 76 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74  rve((void *) int
3c80: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
3c90: 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a 29 20  eserve((void *) 
3ca0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3cb0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3cc0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3cd0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3ce0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3cf0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3d00: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3d10: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3d20: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3d30: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3d40: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3d50: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3d60: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3d70: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3d80: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3d90: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3da0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3db0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3dc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3dd0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3de0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3df0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3e00: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72  void *) statePtr
3e10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75  );..    /* If su
3e20: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62  ccessful, pass b
3e30: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72  ack password str
3e40: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65  ing and truncate
3e50: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a   if too long */.
3e60: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
3e70: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20  TCL_OK) {..char 
3e80: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
3e90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3ea0: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52  mObj(Tcl_GetObjR
3eb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26  esult(interp), &
3ec0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e  len);..if (len >
3ed0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
3ee0: 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d  -1) {..    len =
3ef0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
3f00: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28  -1;..}..strncpy(
3f10: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
3f20: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65  t) len);..buf[le
3f30: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f  n] = '\0';..Tcl_
3f40: 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29  Release((void *)
3f50: 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72   interp);..retur
3f60: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20  n (int) len;.   
3f70: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
3f80: 73 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65  se((void *) inte
3f90: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rp);.    return 
3fa0: 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  -1;.}.../*. *---
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43  . *. * Session C
4000: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65  allback for Clie
4010: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  nts --. *. *.Cal
4020: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73  led when a new s
4030: 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20  ession is added 
4040: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e  to the cache. In
4050: 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73   TLS 1.3. *.this
4060: 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64   may be received
4070: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
4080: 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68  after the handsh
4090: 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c  ake. For. *.earl
40a0: 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68  ier versions, th
40b0: 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69  is will be recei
40c0: 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68  ved during the h
40d0: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69  andshake.. *.Thi
40e0: 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72  s is the preferr
40f0: 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e  ed way to obtain
4100: 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73   a resumable ses
4110: 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  sion.. *. * Resu
4120: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4130: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4140: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4150: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4160: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4170: 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72  es:. *.0 = error
4180: 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77   where session w
4190: 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65  ill be immediate
41a0: 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ly removed from 
41b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
41c0: 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65  he.. *.1 = succe
41d0: 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74  ss where app ret
41e0: 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20  ains session in 
41f0: 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61  session cache, a
4200: 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c  nd must call SSL
4210: 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20  _SESSION_free() 
4220: 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a  when done.. *. *
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
4280: 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61  nt.SessionCallba
4290: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c  ck(SSL *ssl, SSL
42a0: 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f  _SESSION *sessio
42b0: 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  n) {.    State *
42c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
42d0: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
42e0: 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b  ata((SSL *)ssl);
42f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4300: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4310: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4320: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4330: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
4340: 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74  ned char *ticket
4350: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
4360: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
4370: 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f  on_id;.    size_
4380: 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69  t len2;.    unsi
4390: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a  gned int ulen;..
43a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
43b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
43c0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
43d0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
43e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
43f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4400: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  K;.    } else if
4410: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ssl == NULL) {
4420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4430: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4450: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4460: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
4470: 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73  n, session id, s
4480: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61  ession ticket, a
4490: 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73  nd lifetime args
44a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
44b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
44c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
44d0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
44e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
44f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4500: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4510: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20  gObj("session", 
4520: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
4530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4540: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4550: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
4560: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
4570: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
4580: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
4590: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69  );..    /* Sessi
45a0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73  on id */.    ses
45b0: 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
45c0: 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
45d0: 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20  sion, &ulen);.  
45e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
45f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4600: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4610: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
4620: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
4630: 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20  Size) ulen));.. 
4640: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69     /* Session ti
4650: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
4660: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
4670: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ket(session, &ti
4680: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20  cket, &len2);.  
4690: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
46a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
46b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
46c0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
46d0: 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
46e0: 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f  ) len2));..    /
46f0: 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d  * Lifetime - num
4700: 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a  ber of seconds *
4710: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
4720: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4730: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4740: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28  Tcl_NewLongObj((
4750: 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f  long) SSL_SESSIO
4760: 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66  N_get_ticket_lif
4770: 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69  etime_hint(sessi
4780: 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  on)));..    /* E
4790: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
47a0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
47b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
47c0: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61  Ptr);.    EvalCa
47d0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
47e0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
47f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
4800: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4810: 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30  .    /* Return 0
4820: 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73   for now until s
4830: 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20  ession handling 
4840: 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
4850: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c     return 0;.}..
4860: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
48b0: 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f  ALPN Callback fo
48c0: 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50  r Servers and NP
48d0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  N Callback for C
48e0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
48f0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c  Perform protocol
4900: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20   (http/1.1, h2, 
4910: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74  h3, etc.) select
4920: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69  ion for the. *.i
4930: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
4940: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72  on. Called after
4950: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65   Hello and serve
4960: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09  r callbacks.. *.
4970: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73  Where 'out' is s
4980: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
4990: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65   and 'in' is the
49a0: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64   peer advertised
49b0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73   list.. *. * Res
49c0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
49d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
49e0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
49f0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
4a00: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4a10: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
4a20: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20  XT_ERR_OK: ALPN 
4a30: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
4a40: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
4a50: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
4a60: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
4a70: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72  LERT_FATAL: Ther
4a80: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70  e was no overlap
4a90: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69   between the cli
4aa0: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70  ent's. *.    sup
4ab0: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74  plied list and t
4ac0: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67  he server config
4ad0: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  uration. The con
4ae0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  nection will be 
4af0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f  aborted.. *.SSL_
4b00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4b10: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  : ALPN protocol 
4b20: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e  not selected, e.
4b30: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41  g., because no A
4b40: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f  LPN. *.    proto
4b50: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75  cols are configu
4b60: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e  red for this con
4b70: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  nection. The con
4b80: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4b90: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4be0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43  static int.ALPNC
4bf0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
4c00: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
4c10: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
4c20: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c  igned char *outl
4c30: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en,..const unsig
4c40: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e  ned char *in, un
4c50: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e  signed int inlen
4c60: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
4c70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4c80: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
4c90: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
4ca0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
4cb0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
4cc0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
4cd0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  ;.    int code, 
4ce0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  res;..    dprint
4cf0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
4d00: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
4d10: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
4d20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4d30: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4d50: 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20  Select protocol 
4d60: 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73  */.    if (SSL_s
4d70: 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  elect_next_proto
4d80: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
4d90: 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c  **) out, outlen,
4da0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4db0: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  s, statePtr->pro
4dc0: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e  tos_len,..in, in
4dd0: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f  len) == OPENSSL_
4de0: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20  NPN_NEGOTIATED) 
4df0: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e  {../* Match foun
4e00: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f  d */..res = SSL_
4e10: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4e20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
4e30: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f  OPENSSL_NPN_NO_O
4e40: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72  VERLAP = No over
4e50: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73  lap, so use firs
4e60: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65  t item from clie
4e70: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74  nt protocol list
4e80: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4e90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4ea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4eb0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
4ec0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4ed0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b  ) {..return res;
4ee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4ef0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4f00: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
4f10: 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74  han, depth, cert
4f20: 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74   info list, stat
4f30: 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72  us, and error ar
4f40: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
4f50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
4f60: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
4f70: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
4f80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4f90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4fa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4fb0: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b  bj("alpn", -1));
4fc0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4fd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4fe0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
4ff0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5000: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5010: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5020: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5040: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5050: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5060: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e  ewStringObj((con
5070: 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c  st char *) *out,
5080: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5090: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
50a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
50b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  tr, Tcl_NewBoole
50c0: 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c  anObj(res == SSL
50d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29  _TLSEXT_ERR_OK))
50e0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
50f0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
5100: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
5110: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5120: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
5130: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
5140: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
5150: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
5160: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5170: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5180: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5190: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
51a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
51b0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
51c0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
51d0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
51e0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  L;.    }.    Tcl
51f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
5200: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  dPtr);.    retur
5210: 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n res;.}.../*. *
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74  ---. *. * Advert
5270: 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61  ise Protocols Ca
5280: 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20  llback for Next 
5290: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
52a0: 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65  tion (NPN) in Se
52b0: 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a  rverHello --. *.
52c0: 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.called when a
52d0: 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64   TLS server need
52e0: 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70  s a list of supp
52f0: 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20  orted protocols 
5300: 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74  for Next. *.Prot
5310: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e  ocol Negotiation
5320: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5330: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
5340: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a  ide effects:. *.
5350: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
5360: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5370: 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f  RR_OK: NPN proto
5380: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68  col selected. Th
5390: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
53a0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
53b0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
53c0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   NPN protocol no
53d0: 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  t selected. The 
53e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
53f0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5440: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
5450: 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e  N.static int.NPN
5460: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
5470: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75  SL *ssl, const u
5480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f  nsigned char **o
5490: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ut, unsigned int
54a0: 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a   *outlen, void *
54b0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
54c0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
54d0: 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64  ate*)arg;..    d
54e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
54f0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5500: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5510: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5520: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5530: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5540: 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f    /* Set protoco
5550: 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  ls list */.    i
5560: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
5570: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tos != NULL) {..
5580: 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d  *out = statePtr-
5590: 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65  >protos;..*outle
55a0: 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72  n = statePtr->pr
55b0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20  otos_len;.    } 
55c0: 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e  else {..*out = N
55d0: 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20  ULL;..*outlen = 
55e0: 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54  0;..return SSL_T
55f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5600: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
5610: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5620: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a  _OK;.}.#endif...
5630: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
5680: 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  NI Callback for 
5690: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
56a0: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d  .Perform server-
56b0: 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d  side SNI hostnam
56c0: 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65  e selection afte
56d0: 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20  r receiving SNI 
56e0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20  extension. *.in 
56f0: 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61  Client Hello. Ca
5700: 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f  lled after hello
5710: 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65   callback but be
5720: 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61  fore ALPN callba
5730: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
5740: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
5750: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5760: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
5770: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
5780: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
5790: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  :. *.SSL_TLSEXT_
57a0: 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74  ERR_OK: SNI host
57b0: 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64  name is accepted
57c0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
57d0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
57e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
57f0: 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68  ERT_FATAL: SNI h
5800: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5810: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e  ccepted. The con
5820: 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69  nection. *.    i
5830: 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75  s aborted. Defau
5840: 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20  lt for alert is 
5850: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
5860: 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c  ZED_NAME.. *.SSL
5870: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5880: 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68  T_WARNING: SNI h
5890: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
58a0: 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67  ccepted, warning
58b0: 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65   alert. *.    se
58c0: 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65  nt (not supporte
58d0: 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54  d in TLSv1.3). T
58e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
58f0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
5900: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5910: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5920: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61  s not accepted a
5930: 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64  nd not acknowled
5940: 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e  ged,. *.    e.g.
5950: 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20   if SNI has not 
5960: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e  been configured.
5970: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5980: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a  continues.. *. *
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
59e0: 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63  nt.SNICallback(c
59f0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69  onst SSL *ssl, i
5a00: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20  nt *alert, void 
5a10: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
5a20: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
5a30: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
5a40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5a50: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
5a60: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
5a70: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
5a80: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20  nt code, res;.  
5a90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
5aa0: 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  rvername = NULL;
5ab0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
5ac0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
5ad0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
5ae0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
5af0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5b00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5b10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
5b20: 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31   works for TLS 1
5b30: 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a  .2 and earlier *
5b40: 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  /.    servername
5b50: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65   = SSL_get_serve
5b60: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
5b70: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
5b80: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21  name);.    if (!
5b90: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65  servername || se
5ba0: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27  rvername[0] == '
5bb0: 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  \0') {..return S
5bc0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5bd0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5be0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
5bf0: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
5c00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5c10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5c20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5c30: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
5c40: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
5c50: 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65   chan, and serve
5c60: 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20  r name args */. 
5c70: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5c80: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5c90: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5cc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5cd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69  ewStringObj("sni
5ce0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
5cf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5d00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5d10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
5d20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
5d30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
5d40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
5d50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5d60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5d70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5d80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5d90: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c  Obj(servername ,
5da0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45   -1));..    /* E
5db0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
5dc0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
5dd0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
5de0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
5df0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
5e00: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
5e10: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
5e20: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5e30: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5e40: 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72  _WARNING;..*aler
5e50: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43  t = SSL_AD_UNREC
5e60: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a  OGNIZED_NAME; /*
5e70: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   Not supported b
5e80: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  y TLS 1.3 */.   
5e90: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5ea0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
5eb0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5ec0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
5ed0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5ee0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
5ef0: 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  L;..*alert = SSL
5f00: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5f10: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5f20: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5f30: 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  .3 */.    }.    
5f40: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5f50: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5f60: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5f70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69  ------. *. * Cli
5fc0: 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61  entHello Handsha
5fd0: 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ke Callback for 
5fe0: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
5ff0: 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20  .Used by server 
6000: 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73  to examine the s
6010: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63  erver name indic
6020: 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65  ation (SNI) exte
6030: 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65  nsion. *.provide
6040: 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20  d by the client 
6050: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65  in order to sele
6060: 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ct an appropriat
6070: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  e certificate to
6080: 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64  . *.present, and
6090: 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66   make other conf
60a0: 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74  iguration adjust
60b0: 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74  ments relevant t
60c0: 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a  o that server. *
60d0: 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f  .name and its co
60e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69  nfiguration. Thi
60f0: 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70  s includes swapp
6100: 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f  ing out the asso
6110: 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54  ciated. *.SSL_CT
6120: 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66  X pointer, modif
6130: 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27  ying the server'
6140: 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74  s list of permit
6150: 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73  ted TLS versions
6160: 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68  ,. *.changing th
6170: 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65  e server's ciphe
6180: 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e  r list in respon
6190: 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  se to the client
61a0: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20  's cipher list, 
61b0: 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62  etc.. *.Called b
61c0: 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c  efore SNI and AL
61d0: 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a  PN callbacks.. *
61e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
61f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
6200: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
6210: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
6220: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
6230: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
6240: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6250: 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74  RETRY: suspend t
6260: 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e  he handshake, an
6270: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  d the handshake 
6280: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
6290: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
62a0: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
62b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c  ELLO_ERROR: fail
62c0: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63  ure, terminate c
62d0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61  onnection. Set a
62e0: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f  lert to error co
62f0: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  de.. *.SSL_CLIEN
6300: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a  T_HELLO_SUCCESS:
6310: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d   success. *. *--
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
6370: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53  .HelloCallback(S
6380: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
6390: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
63a0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
63b0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
63c0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
63d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
63e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
63f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
6400: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
6410: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73  e, res;.    cons
6420: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61  t char *serverna
6430: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  me;.    const un
6440: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
6450: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20      size_t len, 
6460: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20  remaining;..    
6470: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6480: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
6490: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
64a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
64b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
64c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
64d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
64e0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53  (ssl == (const S
64f0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67  SL *)NULL || arg
6500: 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c   == (void *)NULL
6510: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
6520: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6530: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6540: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20  * Get names */. 
6550: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65     if (!SSL_clie
6560: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78  nt_hello_get0_ex
6570: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59  t(ssl, TLSEXT_TY
6580: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20  PE_server_name, 
6590: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20  &p, &remaining) 
65a0: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  || remaining <= 
65b0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
65c0: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54  SL_R_SSLV3_ALERT
65d0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54  _ILLEGAL_PARAMET
65e0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ER;..return SSL_
65f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6600: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6610: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65  * Extract the le
6620: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70  ngth of the supp
6630: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d  lied list of nam
6640: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d  es. */.    len =
6650: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6660: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6670: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6680: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29   2 != remaining)
6690: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
66a0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
66b0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
66c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
66d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
66f0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20  ining = len;..  
6700: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e    /* The list in
6710: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68   practice only h
6720: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d  as a single elem
6730: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20  ent, so we only 
6740: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72  consider the fir
6750: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  st one. */.    i
6760: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  f (remaining == 
6770: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53  0 || *p++ != TLS
6780: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
6790: 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72  t_name) {..*aler
67a0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
67b0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
67c0: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  RROR;..return SS
67d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
67e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
67f0: 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20  remaining--;..  
6800: 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20    /* Now we can 
6810: 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74  finally pull out
6820: 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20   the byte array 
6830: 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20  with the actual 
6840: 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  hostname. */.   
6850: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c   if (remaining <
6860: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  = 2) {..*alert =
6870: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6880: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6890: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
68a0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
68b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  R;.    }.    len
68c0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29   = (*(p++) << 8)
68d0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70  ;.    len += *(p
68e0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e  ++);.    if (len
68f0: 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67   + 2 > remaining
6900: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6910: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6920: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6930: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6940: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6950: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6960: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73  ing = len;.    s
6970: 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e  ervername = (con
6980: 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20  st char *)p;..  
6990: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
69a0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
69b0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73   fn, chan, and s
69c0: 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20  erver name args 
69d0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
69e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
69f0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
6a00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6a10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6a20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
6a30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6a40: 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20  "hello", -1));. 
6a50: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6a60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6a70: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
6a80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6a90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
6aa0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
6ab0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
6ac0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6ad0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6ae0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
6af0: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72  StringObj(server
6b00: 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29  name, (Tcl_Size)
6b10: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   len));..    /* 
6b20: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
6b30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
6b40: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
6b50: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
6b60: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
6b70: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
6b80: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
6b90: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6ba0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
6bb0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TRY;..*alert = S
6bc0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6bd0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b  _USER_CANCELLED;
6be0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6bf0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
6c00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
6c10: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20  ELLO_SUCCESS;.  
6c20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
6c30: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6c40: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72  LO_ERROR;..*aler
6c50: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6c60: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6c70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6c80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6c90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
6ca0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cc0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73  ***/./* Commands
6cd0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6d40: 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64   * CiphersObjCmd
6d50: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62   -- list availab
6d60: 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a  le ciphers. *. *
6d70: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
6d80: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
6d90: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a  ocess the "tls::
6da0: 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64  ciphers" command
6db0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
6dc0: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62  lable ciphers, b
6dd0: 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63  ased upon protoc
6de0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a  ol selected.. *.
6df0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
6e00: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
6e10: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  sult list.. *. *
6e20: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6e30: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64  *.constructs and
6e40: 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f   destroys SSL co
6e50: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
6e60: 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
6eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74  const char *prot
6ec0: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  ocols[] = {.    
6ed0: 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20  "ssl2", "ssl3", 
6ee0: 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22  "tls1", "tls1.1"
6ef0: 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73  , "tls1.2", "tls
6f00: 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e  1.3", NULL.};.en
6f10: 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20  um protocol {.  
6f20: 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f    TLS_SSL2, TLS_
6f30: 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20  SSL3, TLS_TLS1, 
6f40: 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f  TLS_TLS1_1, TLS_
6f50: 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_2, TLS_TLS1
6f60: 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a  _3, TLS_NONE.};.
6f70: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68  .static int.Ciph
6f80: 65 72 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  ersObjCmd(.    T
6f90: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
6fa0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
6fb0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p *interp,.    i
6fc0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c  nt objc,.    Tcl
6fd0: 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj.*const objv
6fe0: 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []).{.    Tcl_Ob
6ff0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  j *objPtr = NULL
7000: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
7010: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tx = NULL;.    S
7020: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  SL *ssl = NULL;.
7030: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c      STACK_OF(SSL
7040: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20  _CIPHER) *sk;.  
7050: 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 49    char buf[BUFSI
7060: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65  Z];.    int inde
7070: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20  x, verbose = 0, 
7080: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20  use_supported = 
7090: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  0;.    const SSL
70a0: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b  _METHOD *method;
70b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
70c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
70d0: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20   ((objc < 2) || 
70e0: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54  (objc > 4)) {..T
70f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7100: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7110: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62   "protocol ?verb
7120: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f  ose? ?supported?
7130: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
7140: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7150: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
7160: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
7170: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63   objv[1], protoc
7180: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  ols, "protocol",
7190: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
71a0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
71b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
71c0: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
71d0: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 2) && Tcl_GetB
71e0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
71f0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
7200: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f  verbose) != TCL_
7210: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7230: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33     if ((objc > 3
7240: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
7250: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7260: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65  p, objv[3], &use
7270: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54  _supported) != T
7280: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
7290: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
72a0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
72b0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73  _error();..    s
72c0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
72d0: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20  tocol)index) {. 
72e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32     case TLS_SSL2
72f0: 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  :..Tcl_AppendRes
7300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7310: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7320: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7330: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7340: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
7350: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7360: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 09  case TLS_SSL3:..
7370: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7380: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7390: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
73a0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
73b0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e  rted", (char *)N
73c0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
73d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 63 61 73  L_ERROR;.    cas
73e0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
73f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
7400: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7410: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
7420: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7430: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
7440: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7450: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7460: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7470: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7480: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
7490: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
74a0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
74b0: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f  .method = TLSv1_
74c0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
74d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
74e0: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66   TLS_TLS1_1:.#if
74f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7500: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
7510: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
7520: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7530: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
7540: 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65  ETHOD)..Tcl_Appe
7550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7560: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
7570: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
7580: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
7590: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
75a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
75b0: 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d  .#else..method =
75c0: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28   TLSv1_1_method(
75d0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
75e0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c  .    case TLS_TL
75f0: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_2:.#if define
7600: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
7610: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7620: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7630: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7640: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
7650: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7660: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7670: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7680: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7690: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
76a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
76b0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
76c0: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f  .method = TLSv1_
76d0: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  2_method(); brea
76e0: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  k;.#endif.    ca
76f0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23  se TLS_TLS1_3:.#
7700: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7710: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
7720: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7730: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
7740: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
7750: 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70  _METHOD)..Tcl_Ap
7760: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7770: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7780: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7790: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
77a0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
77b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
77c0: 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64  R;.#else..method
77d0: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
77e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
77f0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
7800: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
7810: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
7820: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
7830: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
7840: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 62 72 65 61  _VERSION);..brea
7850: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
7860: 66 61 75 6c 74 3a 0a 09 6d 65 74 68 6f 64 20 3d  fault:..method =
7870: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09   TLS_method();..
7880: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7890: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
78a0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
78b0: 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c   if (ctx == NULL
78c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
78d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45  esult(interp, GE
78e0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
78f0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
7900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c  ;.    }..    ssl
7920: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b   = SSL_new(ctx);
7930: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
7940: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7950: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7960: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7970: 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  (), (char *)NULL
7980: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
7990: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54  (ctx);..return T
79a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
79b0: 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74  .    /* Use list
79c0: 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f   and order as wo
79d0: 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61  uld be sent in a
79e0: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20   ClientHello or 
79f0: 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69  all available ci
7a00: 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20  phers */.    if 
7a10: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20  (use_supported) 
7a20: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31  {..sk = SSL_get1
7a30: 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65  _supported_ciphe
7a40: 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  rs(ssl);.    } e
7a50: 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f  lse {..sk = SSL_
7a60: 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29  get_ciphers(ssl)
7a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
7a80: 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (sk != NULL) {..
7a90: 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a  if (!verbose) {.
7aa0: 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7ab0: 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72  *cp;..    objPtr
7ac0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
7ad0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  j(0, NULL);..   
7ae0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7af0: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7b00: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7b10: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7b20: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7b30: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7b40: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7b50: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7b60: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e  ;..../* cipher n
7b70: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f  ame or (NONE) */
7b80: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48  ...cp = SSL_CIPH
7b90: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a  ER_get_name(c);.
7ba0: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c  ..if (cp == NULL
7bb0: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c  ) break;...Tcl_L
7bc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7bd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
7be0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
7bf0: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09  gObj(cp, -1));..
7c00: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b      }...} else {
7c10: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
7c20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7c30: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20  "",0);..    for 
7c40: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
7c50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75  sk_SSL_CIPHER_nu
7c60: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09  m(sk); i++) {...
7c70: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52  const SSL_CIPHER
7c80: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50   *c = sk_SSL_CIP
7c90: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29  HER_value(sk, i)
7ca0: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c  ;...if (c == NUL
7cb0: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09  L) continue;....
7cc0: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72  /* textual descr
7cd0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
7ce0: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53  pher */...if (SS
7cf0: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70  L_CIPHER_descrip
7d00: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a  tion(c, buf, siz
7d10: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c  eof(buf)) != NUL
7d20: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41  L) {...    Tcl_A
7d30: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74  ppendToObj(objPt
7d40: 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a  r, buf, (Tcl_Siz
7d50: 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b  e) strlen(buf));
7d60: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
7d70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
7d80: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f  j(objPtr, "UNKNO
7d90: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09  WN\n", 8);...}..
7da0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73      }..}..if (us
7db0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
7dc0: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45      sk_SSL_CIPHE
7dd0: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20  R_free(sk);..}. 
7de0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65     }.    SSL_fre
7df0: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f  e(ssl);.    SSL_
7e00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a  CTX_free(ctx);..
7e10: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7e20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
7e30: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
7e40: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
7e50: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e90: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74  -----. *. * Prot
7ea0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c  ocolsObjCmd -- l
7eb0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72  ist available pr
7ec0: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68  otocols. *. *.Th
7ed0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
7ee0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
7ef0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f  ss the "tls::pro
7f00: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a  tocols" command.
7f10: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
7f20: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a  able protocols..
7f30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
7f40: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
7f50: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a   result list.. *
7f60: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
7f70: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
7fd0: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  nt.ProtocolsObjC
7fe0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
7ff0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
8000: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8010: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
8020: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ,.    Tcl_Obj *c
8030: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
8040: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
8050: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
8060: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
8070: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20   if (objc != 1) 
8080: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
8090: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
80a0: 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72  bjv, "");..retur
80b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
80c0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
80d0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
80e0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
80f0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
8100: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
8110: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
8120: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8130: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
8140: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8150: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  1_METHOD).    Tc
8160: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8170: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8180: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8190: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
81a0: 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29  s[TLS_TLS1], -1)
81b0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
81c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
81d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
81e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
81f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8200: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
8210: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
8220: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8230: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8240: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8250: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8260: 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29  LS_TLS1_1], -1))
8270: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8280: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
8290: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
82a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
82b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
82c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
82d0: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
82e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
82f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8300: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8310: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
8320: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b  S_TLS1_2], -1));
8330: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8340: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
8350: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8360: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
8370: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
8380: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8390: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
83a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
83b0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
83c0: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  3], -1));.#endif
83d0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
83e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
83f0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
8400: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
8410: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61  -------. *. * Ha
8460: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d  ndshakeObjCmd --
8470: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d  . *. *.This comm
8480: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76  and is used to v
8490: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68  erify whether th
84a0: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63  e handshake is c
84b0: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f  omplete. *.or no
84c0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
84d0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
84e0: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65  Tcl result. 1 me
84f0: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f  ans handshake co
8500: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20  mplete, 0 means 
8510: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53  pending.. *. * S
8520: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
8530: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65  May force SSL ne
8540: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b  gotiation to tak
8550: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d  e place.. *. *--
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
85b0: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  t HandshakeObjCm
85c0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
85d0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85f0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
8600: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
8610: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
8620: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
8630: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an;        /* Th
8640: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
8650: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
8660: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
8670: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c  tr;        /* cl
8680: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
8690: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
86a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72   const char *err
86b0: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Str = NULL;.    
86c0: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20  int ret = 1;.   
86d0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20   int err = 0;.. 
86e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
86f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
8700: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
8710: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8720: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
8730: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
8740: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8750: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
8760: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
8770: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
8780: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
8790: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
87a0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  v[1]), NULL);.  
87b0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
87c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
87d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
87e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
87f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
8800: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
8810: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
8820: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
8830: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
8840: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
8850: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
8860: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
8870: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
8880: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8890: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
88a0: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
88b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
88c0: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
88d0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
88e0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
88f0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
8900: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
8910: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8920: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
8930: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ID", (char *)NUL
8940: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
8950: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8960: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
8970: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
8980: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
8990: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69  chan);..    dpri
89a0: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73  ntf("Calling Tls
89b0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22  _WaitForConnect"
89c0: 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73  );.    ret = Tls
89d0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  _WaitForConnect(
89e0: 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20  statePtr, &err, 
89f0: 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  1);.    dprintf(
8a00: 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e  "Tls_WaitForConn
8a10: 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69  ect returned: %i
8a20: 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66  ", ret);..    if
8a30: 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73   (ret < 0 && ((s
8a40: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
8a50: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20   TLS_TCL_ASYNC) 
8a60: 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49  && (err == EAGAI
8a70: 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  N))) {..dprintf(
8a80: 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65  "Async set and e
8a90: 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09  rr = EAGAIN");..
8aa0: 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65  ret = 0;.    } e
8ab0: 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29  lse if (ret < 0)
8ac0: 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b   {..long result;
8ad0: 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65  ..errStr = state
8ae0: 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52  Ptr->err;..Tcl_R
8af0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
8b00: 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e  p);..Tcl_SetErrn
8b10: 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65  o(err);...if (!e
8b20: 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74  rrStr || (*errSt
8b30: 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20  r == 0)) {..    
8b40: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73  errStr = Tcl_Pos
8b50: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ixError(interp);
8b60: 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64  ..}...Tcl_Append
8b70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8b80: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
8b90: 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68  : ", errStr, (ch
8ba0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 69 66 20  ar *)NULL);..if 
8bb0: 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67  ((result = SSL_g
8bc0: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
8bd0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
8be0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b   != X509_V_OK) {
8bf0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
8c00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8c10: 20 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30   due to \"", X50
8c20: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
8c30: 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c  ror_string(resul
8c40: 74 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20  t), "\"", (char 
8c50: 2a 29 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c  *)NULL);..}..Tcl
8c60: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
8c70: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
8c80: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45  NDSHAKE", "FAILE
8c90: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
8ca0: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74  );..dprintf("Ret
8cb0: 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52  urning TCL_ERROR
8cc0: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20   with handshake 
8cd0: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72  failed: %s", err
8ce0: 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Str);..return TC
8cf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65  L_ERROR;.    } e
8d00: 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21  lse {..if (err !
8d10: 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  = 0) {..    dpri
8d20: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f  ntf("Got an erro
8d30: 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74  r with a complet
8d40: 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72  ed handshake: er
8d50: 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09  r = %i", err);..
8d60: 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20  }..ret = 1;.    
8d70: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
8d80: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b  Returning TCL_OK
8d90: 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c   with data \"%i\
8da0: 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63  "", ret);.    Tc
8db0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
8dc0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
8dd0: 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20  tObj(ret));.    
8de0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8df0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8e40: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d   ImportObjCmd --
8e50: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
8e60: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
8e70: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
8e80: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  "ssl" command. *
8e90: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d  . *.The ssl comm
8ea0: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f  and pushes SSL o
8eb0: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e  ver a (newly con
8ec0: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b  nected) tcp sock
8ed0: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  et. *. * Results
8ee0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
8ef0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
8f00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
8f10: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
8f20: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
8f30: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
8f40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
8f90: 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43  c int.ImportObjC
8fa0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
8fb0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
8fc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8fd0: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
8fe0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ,.    Tcl_Obj *c
8ff0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20  onst objv[]).{. 
9000: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
9010: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
9020: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
9030: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74  de on. */.    St
9040: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09  ate *statePtr;..
9050: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20  /* client state 
9060: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a  for ssl socket *
9070: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  /.    SSL_CTX *c
9080: 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tx..= NULL;.    
9090: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
90a0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
90b0: 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09  _Obj *password..
90c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
90d0: 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c  Obj *vcmd..= NUL
90e0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
90f0: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
9100: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
9110: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
9120: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
9130: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
9140: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
9150: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63   int idx;.    Tc
9160: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20  l_Size len;.    
9170: 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c  int flags...= TL
9180: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20  S_TCL_INIT;.    
9190: 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30  int server...= 0
91a0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69  ;./* is connecti
91b0: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f  on incoming or o
91c0: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20  utgoing? */.    
91d0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d  char *keyfile..=
91e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
91f0: 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c  *certfile..= NUL
9200: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
9210: 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c  char *key..= NUL
9220: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  L;.    Tcl_Size 
9230: 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20  key_len..= 0;.  
9240: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9250: 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *cert..= NULL;. 
9260: 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74     Tcl_Size cert
9270: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63  _len..= 0;.    c
9280: 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20  har *ciphers..= 
9290: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
92a0: 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20  ciphersuites..= 
92b0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
92c0: 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  CAfile..= NULL;.
92d0: 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68      char *CApath
92e0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
92f0: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20  ar *DHparams..= 
9300: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9310: 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a  model...= NULL;.
9320: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72      char *server
9330: 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a  name..= NULL;./*
9340: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65   hostname for Se
9350: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61  rver Name Indica
9360: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72  tion */.    char
9370: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20   *session_id..= 
9380: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9390: 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b  j *alpn..= NULL;
93a0: 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20  .    int ssl2 = 
93b0: 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20  0, ssl3 = 0;.   
93c0: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74   int tls1 = 1, t
93d0: 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_1 = 1, tls1_
93e0: 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20  2 = 1, tls1_3 = 
93f0: 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f  1;.    int proto
9400: 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31   = 0, level = -1
9410: 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79  ;.    int verify
9420: 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20   = 0, require = 
9430: 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20  0, request = 1, 
9440: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d  post_handshake =
9450: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
9460: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
9470: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9480: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9490: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c  NSSL_NO_TLS1) ||
94a0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
94b0: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
94c0: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23  .    tls1 = 0;.#
94d0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
94e0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
94f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9500: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
9510: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
9520: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
9530: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a      tls1_1 = 0;.
9540: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9550: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
9560: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
9570: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  _NO_TLS1_2) || d
9580: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9590: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
95a0: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b  .    tls1_2 = 0;
95b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
95c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
95d0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
95e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
95f0: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e   tls1_3 = 0;.#en
9600: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  dif..    if (obj
9610: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
9620: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9630: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
9640: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29  nnel ?options?")
9650: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
9660: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
9670: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
9680: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  );..    chan = T
9690: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
96a0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
96b0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55  ing(objv[1]), NU
96c0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
96d0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
96e0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
96f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9700: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
9710: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
9720: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
9730: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
9740: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
9750: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
9760: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32      for (idx = 2
9770: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
9780: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70  x++) {..char *op
9790: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
97a0: 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09  g(objv[idx]);...
97b0: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d  if (opt[0] != '-
97c0: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ')..    break;..
97d0: 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c  .OPTOBJ("-alpn",
97e0: 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28   alpn);..OPTSTR(
97f0: 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68  "-cadir", CApath
9800: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66  );..OPTSTR("-caf
9810: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09  ile", CAfile);..
9820: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c  OPTBYTE("-cert",
9830: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29   cert, cert_len)
9840: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74  ;..OPTSTR("-cert
9850: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29  file", certfile)
9860: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9870: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  er", ciphers);..
9880: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9890: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
98a0: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69  TSTR("-ciphersui
98b0: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74  tes", ciphersuit
98c0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63  es);..OPTOBJ("-c
98d0: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29  ommand", script)
98e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61  ;..OPTSTR("-dhpa
98f0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29  rams", DHparams)
9900: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79  ;..OPTBYTE("-key
9910: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  ", key, key_len)
9920: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66  ;..OPTSTR("-keyf
9930: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a  ile", keyfile);.
9940: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22  .OPTSTR("-model"
9950: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42  , model);..OPTOB
9960: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70  J("-password", p
9970: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f  assword);..OPTBO
9980: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68  OL("-post_handsh
9990: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73  ake", post_hands
99a0: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  hake);..OPTBOOL(
99b0: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
99c0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  est);..OPTBOOL("
99d0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69  -require", requi
99e0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73  re);..OPTINT("-s
99f0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
9a00: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c  level);..OPTBOOL
9a10: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76  ("-server", serv
9a20: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  er);..OPTSTR("-s
9a30: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
9a40: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52  ername);..OPTSTR
9a50: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ("-session_id", 
9a60: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50  session_id);..OP
9a70: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73  TBOOL("-ssl2", s
9a80: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl2);..OPTBOOL("
9a90: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09  -ssl3", ssl3);..
9aa0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c  OPTBOOL("-tls1",
9ab0: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c   tls1);..OPTBOOL
9ac0: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31  ("-tls1.1", tls1
9ad0: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  _1);..OPTBOOL("-
9ae0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29  tls1.2", tls1_2)
9af0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9b00: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09  1.3", tls1_3);..
9b10: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74  OPTOBJ("-validat
9b20: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29  ecommand", vcmd)
9b30: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64  ;..OPTOBJ("-vcmd
9b40: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42  ", vcmd);...OPTB
9b50: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61  AD("option", "-a
9b60: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61  lpn, -cadir, -ca
9b70: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65  file, -cert, -ce
9b80: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c  rtfile, -cipher,
9b90: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   -ciphersuites, 
9ba0: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72  -command, -dhpar
9bb0: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66  ams, -key, -keyf
9bc0: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61  ile, -model, -pa
9bd0: 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61  ssword, -post_ha
9be0: 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73  ndshake, -reques
9bf0: 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65  t, -require, -se
9c00: 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73  curity_level, -s
9c10: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
9c20: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c  me, -session_id,
9c30: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d   -ssl2, -ssl3, -
9c40: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d  tls1, -tls1.1, -
9c50: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c  tls1.2, -tls1.3,
9c60: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d   or -validatecom
9c70: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  mand");...return
9c80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9c90: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
9ca0: 74 29 09 20 20 20 20 76 65 72 69 66 79 20 7c 3d  t).    verify |=
9cb0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45   SSL_VERIFY_CLIE
9cc0: 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45  NT_ONCE | SSL_VE
9cd0: 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69  RIFY_PEER;.    i
9ce0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65  f (request && re
9cf0: 71 75 69 72 65 29 20 76 65 72 69 66 79 20 7c 3d  quire) verify |=
9d00: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
9d10: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
9d20: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  ;.    if (reques
9d30: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
9d40: 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ake).verify |= S
9d50: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
9d60: 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66  ANDSHAKE;.    if
9d70: 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 76   (verify == 0).v
9d80: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49  erify = SSL_VERI
9d90: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72  FY_NONE;..    pr
9da0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54  oto |= (ssl2 ? T
9db0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20  LS_PROTO_SSL2 : 
9dc0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9dd0: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f   (ssl3 ? TLS_PRO
9de0: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20  TO_SSL3 : 0);.  
9df0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
9e00: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
9e10: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
9e20: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54  o |= (tls1_1 ? T
9e30: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20  LS_PROTO_TLS1_1 
9e40: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9e50: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53  |= (tls1_2 ? TLS
9e60: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20  _PROTO_TLS1_2 : 
9e70: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9e80: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50   (tls1_3 ? TLS_P
9e90: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29  ROTO_TLS1_3 : 0)
9ea0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20  ;..    /* reset 
9eb0: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b  to NULL if blank
9ec0: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64   string provided
9ed0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74   */.    if (cert
9ee0: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20   && !*cert)..   
9ef0: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20       cert.      
9f00: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9f10: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09   (key && !*key).
9f20: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20  .        key.   
9f30: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9f40: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26   if (certfile &&
9f50: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20   !*certfile)    
9f60: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20       certfile.= 
9f70: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65  NULL;.    if (ke
9f80: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69  yfile && !*keyfi
9f90: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20  le)..keyfile.   
9fa0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9fb0: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20   if (ciphers && 
9fc0: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20  !*ciphers).     
9fd0: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20     ciphers.     
9fe0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9ff0: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20  f (ciphersuites 
a000: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65  && !*ciphersuite
a010: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20  s) ciphersuites 
a020: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a030: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43  f (CAfile && !*C
a040: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43  Afile).        C
a050: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  Afile.        = 
a060: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
a070: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68  path && !*CApath
a080: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68  ).        CApath
a090: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a0a0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
a0b0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29  s && !*DHparams)
a0c0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d  .        DHparam
a0d0: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  s        = NULL;
a0e0: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c  ..    /* new SSL
a0f0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
a100: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65  atePtr..= (State
a110: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
a120: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74  igned) sizeof(St
a130: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ate));.    memse
a140: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73  t(statePtr, 0, s
a150: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a  izeof(State));..
a160: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
a170: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags.= flags;.   
a180: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
a190: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p.= interp;.    
a1a0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
a1b0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73  .= verify;.    s
a1c0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22  tatePtr->err.= "
a1d0: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  ";..    /* alloc
a1e0: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ate script */.  
a1f0: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a    if (script) {.
a200: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
a210: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72  tringFromObj(scr
a220: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ipt, &len);..if 
a230: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a240: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
a250: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54  = script;..    T
a260: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a270: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a280: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ck);..}.    }.. 
a290: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70     /* allocate p
a2a0: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69  assword */.    i
a2b0: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  f (password) {..
a2c0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a2d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73  ringFromObj(pass
a2e0: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  word, &len);..if
a2f0: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
a300: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a310: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20   = password;..  
a320: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a330: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
a340: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d  sword);..}.    }
a350: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a360: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61  e validate comma
a370: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63  nd */.    if (vc
a380: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  md) {..(void) Tc
a390: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a3a0: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a  bj(vcmd, &len);.
a3b0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a3c0: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20   statePtr->vcmd 
a3d0: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c  = vcmd;..    Tcl
a3e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a3f0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
a400: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  }.    }..    if 
a410: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  (model != NULL) 
a420: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a  {..int mode;../*
a430: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22   Get the "model"
a440: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61   context */..cha
a450: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
a460: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c  el(interp, model
a470: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63  , &mode);..if (c
a480: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
a490: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  nel) NULL) {..  
a4a0: 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64    Tls_Free((void
a4b0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20   *)statePtr);.. 
a4c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a4d0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
a4e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
a4f0: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
a500: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
a510: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a520: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
a530: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
a540: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
a550: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
a560: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
a570: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a580: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
a590: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
a5a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
a5b0: 29 2c 0a 09 09 20 20 20 20 22 5c 22 3a 20 6e 6f  ),...    "\": no
a5c0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
a5d0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
a5e0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a5f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a600: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a610: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
a620: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  LID", (char *)NU
a630: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
a640: 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65  ee((void *)state
a650: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a660: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a670: 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a  .ctx = ((State *
a680: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
a690: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
a6a0: 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65  ))->ctx;.    } e
a6b0: 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20  lse {..if ((ctx 
a6c0: 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65  = CTX_Init(state
a6d0: 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f  Ptr, server, pro
a6e0: 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72  to, keyfile, cer
a6f0: 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74  tfile, key, cert
a700: 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 09 63 65 72  , key_len,...cer
a710: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43  t_len, CApath, C
a720: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
a730: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
a740: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
a750: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
a760: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a  Tls_Free((void *
a770: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
a780: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a790: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
a7a0: 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d   statePtr->ctx =
a7b0: 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20   ctx;..    /*.  
a7c0: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20     * We need to 
a7d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
a7e0: 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73  he channel works
a7f0: 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20   in binary (for 
a800: 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79  the.     * encry
a810: 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74  ption not to get
a820: 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20   goofed up)..   
a830: 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74    * We only want
a840: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62   to adjust the b
a850: 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d  uffering in pre-
a860: 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65  v2 channels, whe
a870: 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63  re.     * each c
a880: 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74  hannel in the st
a890: 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69  ack maintained i
a8a0: 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a  ts own buffers..
a8b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f       */.    Tcl_
a8c0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
a8d0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
a8e0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
a8f0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
a900: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
a910: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
a920: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
a930: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
a940: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
a950: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  t(&upperChannelE
a960: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
a970: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
a980: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
a990: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70   "-eofchar", &up
a9a0: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
a9b0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  r);.    Tcl_GetC
a9c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
a9d0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63  erp, chan, "-enc
a9e0: 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68  oding", &upperCh
a9f0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
aa00: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
aa10: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
aa20: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
aa30: 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61  tion", &upperCha
aa40: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
aa50: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
aa60: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
aa70: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
aa80: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
aa90: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20  nelBlocking);.  
aaa0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
aab0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
aac0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
aad0: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a  on", "binary");.
aae0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
aaf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
ab00: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
ab10: 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20  g", "true");.   
ab20: 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d   dprintf("Consum
ab30: 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20  ing Tcl channel 
ab40: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
ab50: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a  nelName(chan));.
ab60: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
ab70: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68  lf = Tcl_StackCh
ab80: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c  annel(interp, Tl
ab90: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c  s_ChannelType(),
aba0: 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f   statePtr, (TCL_
abb0: 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57  READABLE | TCL_W
abc0: 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b  RITABLE), chan);
abd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72  .    dprintf("Cr
abe0: 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61  eated channel na
abf0: 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  med %s", Tcl_Get
ac00: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
ac10: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
ac20: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
ac30: 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61  self == (Tcl_Cha
ac40: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f  nnel) NULL) {../
ac50: 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20  *.. * No use of 
ac60: 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72  Tcl_EventuallyFr
ac70: 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f  ee because no po
ac80: 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65  ssible Tcl_Prese
ac90: 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46  rve... */..Tls_F
aca0: 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74  ree((void *)stat
acb0: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
acc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
acd0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
ace0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
acf0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
ad00: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
ad10: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
ad20: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
ad30: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20  Translation));. 
ad40: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ad50: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ad60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
ad70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c  "-encoding", Tcl
ad80: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
ad90: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
ada0: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ing));.    Tcl_S
adb0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
adc0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
add0: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61  ->self, "-eofcha
ade0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
adf0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
ae00: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
ae10: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
ae20: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
ae30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
ae40: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44  blocking", Tcl_D
ae50: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
ae60: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
ae70: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  g));.    Tcl_DSt
ae80: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
ae90: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
aea0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
aeb0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
aec0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
aed0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
aee0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
aef0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
af00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
af10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
af20: 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  king);..    /*. 
af30: 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61      * SSL Initia
af40: 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f  lization.     */
af50: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
af60: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61  sl = SSL_new(sta
af70: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20  tePtr->ctx);.   
af80: 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e   if (!statePtr->
af90: 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c  ssl) {../* SSL l
afa0: 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a  ibrary error */.
afb0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
afc0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64  t(interp, "could
afd0: 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73  n't construct ss
afe0: 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45  l session: ", GE
aff0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
b000: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
b010: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b020: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b030: 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22  "IMPORT", "INIT"
b040: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b050: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f  r *)NULL);..Tls_
b060: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61  Free((void *)sta
b070: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
b080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b090: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
b0a0: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
b0b0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
b0c0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
b0d0: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
b0e0: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
b0f0: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
b100: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
b110: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
b120: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
b130: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
b140: 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33  g, though RFC 43
b150: 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a  66 says UTF-8. *
b160: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f  /..if (!SSL_set_
b170: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65  tlsext_host_name
b180: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
b190: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72  servername) && r
b1a0: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54  equire) {..    T
b1b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b1c0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49  interp, "Set SNI
b1d0: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65   extension faile
b1e0: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b1f0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b200: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b210: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b220: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b230: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41  ORT", "SNI", "FA
b240: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e  ILED", (char *)N
b250: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
b260: 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74  ree((void *)stat
b270: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
b280: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
b290: 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61  .../* Set hostna
b2a0: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74  me for peer cert
b2b0: 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65  ificate hostname
b2c0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e   verification in
b2d0: 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f   clients...   Do
b2e0: 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31  n't use SSL_set1
b2f0: 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68  _host since it h
b300: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20  as limitations. 
b310: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64  */..if (!SSL_add
b320: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d  1_host(statePtr-
b330: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
b340: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
b350: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b360: 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74  p, "Set DNS host
b370: 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  name failed: ", 
b380: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b390: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b3a0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
b3b0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b3c0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b3d0: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49  "HOSTNAME", "FAI
b3e0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  LED", (char *)NU
b3f0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
b400: 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65  ee((void *)state
b410: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
b420: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b430: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
b440: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20  sume session id 
b450: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69  */.    if (sessi
b460: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28  on_id && strlen(
b470: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53  session_id) <= S
b480: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c  SL_MAX_SID_CTX_L
b490: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c  ENGTH) {../* SSL
b4a0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a  _set_session() *
b4b0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53  /..if (!SSL_SESS
b4c0: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74  ION_set1_id_cont
b4d0: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73  ext(SSL_get_sess
b4e0: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ion(statePtr->ss
b4f0: 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73  l),...(const uns
b500: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65  igned char *) se
b510: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67  ssion_id, (unsig
b520: 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28  ned int) strlen(
b530: 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a  session_id))) {.
b540: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b550: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52  esult(interp, "R
b560: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61  esume session fa
b570: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
b580: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b590: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54   *)NULL);..    T
b5a0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b5b0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b5c0: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b5d0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b5e0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
b5f0: 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64    Tls_Free((void
b600: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20   *)statePtr);.. 
b610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b620: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
b630: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70     /* Enable App
b640: 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50  lication-Layer P
b650: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
b660: 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72  ion. Examples ar
b670: 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74  e: http/1.0,..ht
b680: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
b690: 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c  ftp, imap, pop3,
b6a0: 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d   xmpp-client, xm
b6b0: 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c  pp-server, mqtt,
b6c0: 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20   irc, etc. */.  
b6d0: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f    if (alpn) {../
b6e0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20  * Convert a TCL 
b6f0: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74  list into a prot
b700: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72  ocol-list in wir
b710: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73  e-format */..uns
b720: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
b730: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65  os, *p;..unsigne
b740: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e  d int protos_len
b750: 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20   = 0;..Tcl_Size 
b760: 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a  cnt, i;..int j;.
b770: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b  .Tcl_Obj **list;
b780: 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
b790: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
b7a0: 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74  terp, alpn, &cnt
b7b0: 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f  , &list) != TCL_
b7c0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  OK) {..    Tls_F
b7d0: 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74  ree((void *)stat
b7e0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
b7f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
b800: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
b810: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  the memory requi
b820: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74  red for the prot
b830: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f  ocol-list */..fo
b840: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e  r (i = 0; i < cn
b850: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54  t; i++) {..    T
b860: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b870: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65  Obj(list[i], &le
b880: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  n);..    if (len
b890: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f   > 255) {...Tcl_
b8a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b8b0: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f  erp, "ALPN proto
b8c0: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f  col names too lo
b8d0: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ng", (char *)NUL
b8e0: 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72  L);...Tcl_SetErr
b8f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b900: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b910: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22  "ALPN", "FAILED"
b920: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b930: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69  ...Tls_Free((voi
b940: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
b950: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
b960: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70  R;..    }..    p
b970: 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b  rotos_len += 1 +
b980: 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a   (int) len;..}..
b990: 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f  ./* Build the co
b9a0: 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d  mplete protocol-
b9b0: 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20  list */..protos 
b9c0: 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73  = ckalloc(protos
b9d0: 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f  _len);../* proto
b9e0: 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73  col-lists consis
b9f0: 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74  t of 8-bit lengt
ba00: 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65  h-prefixed, byte
ba10: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72   strings */..for
ba20: 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f   (j = 0, p = pro
ba30: 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b  tos; j < cnt; j+
ba40: 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  +) {..    char *
ba50: 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  str = Tcl_GetStr
ba60: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b  ingFromObj(list[
ba70: 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20  j], &len);..    
ba80: 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64  *p++ = (unsigned
ba90: 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20   char) len;..   
baa0: 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20   memcpy(p, str, 
bab0: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09  (size_t) len);..
bac0: 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d      p += len;..}
bad0: 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c  .../* SSL_set_al
bae0: 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20  pn_protos makes 
baf0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72  a copy of the pr
bb00: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
bb10: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75  /* Note: This fu
bb20: 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20  nction reverses 
bb30: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
bb40: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09   convention */..
bb50: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  if (SSL_set_alpn
bb60: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72  _protos(statePtr
bb70: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70  ->ssl, protos, p
bb80: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20  rotos_len)) {.. 
bb90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
bba0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
bbb0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20   ALPN protocols 
bbc0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
bbd0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
bbe0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
bbf0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
bc00: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
bc10: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e   "IMPORT", "ALPN
bc20: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
bc30: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
bc40: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20   Tls_Free((void 
bc50: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
bc60: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29    ckfree(protos)
bc70: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
bc80: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
bc90: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73   Store protocols
bca0: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50   list */..stateP
bcb0: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f  tr->protos = pro
bcc0: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tos;..statePtr->
bcd0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f  protos_len = pro
bce0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
bcf0: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
bd00: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
bd10: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
bd20: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  s_len = 0;.    }
bd30: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
bd40: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
bd50: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65     */.    SSL_se
bd60: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65  t_app_data(state
bd70: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
bd80: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20  *)statePtr);./* 
bd90: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73  point back to us
bda0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
bdb0: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
bdc0: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
bdd0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
bde0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
bdf0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
be00: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
be10: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
be20: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
be30: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
be40: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
be50: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
be60: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
be70: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
be80: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
be90: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
bea0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
beb0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
bec0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
bed0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
bee0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
bef0: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
bf00: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
bf10: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
bf20: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
bf30: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
bf40: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
bf50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bf60: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
bf70: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
bf80: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
bf90: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
bfa0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
bfb0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
bfc0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
bfd0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
bfe0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
bff0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
c000: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
c010: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
c020: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
c030: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
c040: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
c050: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
c060: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c070: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
c080: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c090: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
c0a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
c0b0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
c0c0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
c0d0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
c0e0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
c0f0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c100: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
c110: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c120: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c130: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
c140: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
c150: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
c160: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c170: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
c180: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
c190: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
c1a0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c1b0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
c1c0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
c1d0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
c1e0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
c1f0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c200: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
c210: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
c220: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
c230: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
c240: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
c250: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
c260: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
c270: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
c280: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
c290: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
c2a0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
c2b0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
c2c0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
c2d0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
c2e0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
c2f0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c300: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26  post_handshake &
c310: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20  & tls1_3) {..   
c320: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
c330: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
c340: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c350: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75  ;..}.../* set au
c360: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65  tomatic curve se
c370: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  lection */..SSL_
c380: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74  set_ecdh_auto(st
c390: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
c3a0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
c3b0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
c3c0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
c3d0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
c3e0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
c3f0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c400: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
c410: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
c420: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
c430: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
c440: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c450: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
c460: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c470: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
c480: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c490: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
c4a0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c4b0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c4c0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
c4d0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
c4e0: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
c4f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
c500: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
c510: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
c520: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
c530: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
c540: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
c550: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
c560: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
c570: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c580: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
c590: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
c5a0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
c5b0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
c5c0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
c5d0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
c5e0: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
c5f0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
c600: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
c610: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
c620: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
c630: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
c640: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
c650: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
c660: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
c670: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
c680: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
c690: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
c6a0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
c6b0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
c6c0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
c6d0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
c6e0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
c6f0: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
c700: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
c710: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
c720: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
c730: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
c740: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
c750: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
c760: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
c770: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c780: 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  , (char *)Tcl_Ge
c790: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
c7a0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43  tePtr->self), TC
c7b0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
c7c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c7d0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
c820: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d   * UnimportObjCm
c830: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
c840: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
c850: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  oked to remove t
c860: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
c870: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a  el filter.. *. *
c880: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
c890: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
c8a0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
c8b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
c8c0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
c8d0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
c8e0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
c930: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e  /..static int.Un
c940: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20  importObjCmd(.  
c950: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
c960: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
c970: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
c980: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20    int objc,.    
c990: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
c9a0: 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c  bjv[]).{.    Tcl
c9b0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
c9c0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
c9d0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
c9e0: 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   */..    dprintf
c9f0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
ca00: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
ca10: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
ca20: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
ca30: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
ca40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ca50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
ca60: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
ca70: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
ca80: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ca90: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
caa0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
cab0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
cac0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
cad0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
cae0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
caf0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
cb00: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
cb10: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
cb20: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
cb30: 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54  han);..    if (T
cb40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
cb50: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
cb60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
cb70: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
cb80: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
cb90: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
cba0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
cbb0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
cbc0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
cbd0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
cbe0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
cbf0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
cc00: 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48   "UNIMPORT", "CH
cc10: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
cc20: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
cc30: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
cc40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
cc50: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43  if (Tcl_UnstackC
cc60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
cc70: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  han) == TCL_ERRO
cc80: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  R) {..return TCL
cc90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cca0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
ccb0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
cd00: 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d  *. * CTX_Init --
cd10: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c   construct a SSL
cd20: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a  _CTX instance. *
cd30: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
cd40: 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20  A valid SSL_CTX 
cd50: 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c  instance or NULL
cd60: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
cd70: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75  ects:. *.constru
cd80: 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  cts SSL context 
cd90: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
cde0: 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43  */..static SSL_C
cdf0: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 0a 20  TX *.CTX_Init(. 
ce00: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
ce10: 74 72 2c 0a 20 20 20 20 69 6e 74 20 69 73 53 65  tr,.    int isSe
ce20: 72 76 65 72 2c 0a 20 20 20 20 69 6e 74 20 70 72  rver,.    int pr
ce30: 6f 74 6f 2c 0a 20 20 20 20 63 68 61 72 20 2a 6b  oto,.    char *k
ce40: 65 79 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72  eyfile,.    char
ce50: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20   *certfile,.    
ce60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
ce70: 65 79 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ey,.    unsigned
ce80: 20 63 68 61 72 20 2a 63 65 72 74 2c 0a 20 20 20   char *cert,.   
ce90: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 0a 20 20   int key_len,.  
cea0: 20 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 0a    int cert_len,.
ceb0: 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68      char *CApath
cec0: 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69  ,.    char *CAfi
ced0: 6c 65 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 69  le,.    char *ci
cee0: 70 68 65 72 73 2c 0a 20 20 20 20 63 68 61 72 20  phers,.    char 
cef0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 0a 20  *ciphersuites,. 
cf00: 20 20 20 69 6e 74 20 6c 65 76 65 6c 2c 0a 20 20     int level,.  
cf10: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73    char *DHparams
cf20: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ).{.    Tcl_Inte
cf30: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61  rp *interp = sta
cf40: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
cf50: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
cf60: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
cf70: 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20  DString ds;.    
cf80: 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f  int off = 0, abo
cf90: 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  rt = 0;.    int 
cfa0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
cfb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
cfc0: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a  METHOD *method;.
cfd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
cfe0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
cff0: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f  (!proto) {..Tcl_
d000: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d010: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70  erp, "no valid p
d020: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
d030: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
d040: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d050: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
d060: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
d070: 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 4e 41 42   */.    if (ENAB
d080: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d090: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54  ROTO_SSL2)) {..T
d0a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d0b0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72  interp, "SSL2 pr
d0c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d0d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e  rted", (char *)N
d0e0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d0f0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
d100: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29   TLS_PROTO_SSL3)
d120: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d130: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
d140: 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL3 protocol not
d150: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
d160: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
d170: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d180: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d190: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
d1a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d1b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d1c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48  SSL_NO_TLS1_METH
d1d0: 4f 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  OD).    if (ENAB
d1e0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d1f0: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54  ROTO_TLS1)) {..T
d200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d210: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30  interp, "TLS 1.0
d220: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d230: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d240: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
d250: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d260: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d270: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
d280: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d290: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
d2a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d2b0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_1_METHOD).  
d2c0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d2d0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
d2e0: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_1)) {..Tcl_A
d2f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d300: 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f  rp, "TLS 1.1 pro
d310: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d320: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ted", (char *)NU
d330: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d340: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d350: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d360: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
d370: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d380: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
d390: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d3a0: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 69 66  2_METHOD).    if
d3b0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d3c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d3d0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
d3e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d3f0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
d400: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d410: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
d420: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d430: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
d440: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
d450: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
d460: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
d470: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d480: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d490: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63  O_TLS1_3)) {..Tc
d4a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4b0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20  nterp, "TLS 1.3 
d4c0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d4d0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d4e0: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
d4f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d500: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  if.    if (proto
d510: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65   == 0) {../* Use
d520: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09   full range */..
d530: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
d540: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
d550: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  x, 0);..SSL_CTX_
d560: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
d570: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20  rsion(ctx, 0);. 
d580: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
d590: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21   (proto) {.#if !
d5a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
d5b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d5c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26  NSSL_NO_TLS1) &&
d5d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d5e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
d5f0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
d600: 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68  ROTO_TLS1:..meth
d610: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d620: 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74  TLSv1_server_met
d630: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c  hod() : TLSv1_cl
d640: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
d650: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
d660: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d670: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
d680: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d690: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
d6a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d6b0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _1_METHOD).    c
d6c0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
d6d0: 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_1:..method = 
d6e0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
d6f0: 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _1_server_method
d700: 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69  () : TLSv1_1_cli
d710: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
d720: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
d730: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
d740: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
d750: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d760: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
d770: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d780: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  2_METHOD).    ca
d790: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
d7a0: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_2:..method = i
d7b0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
d7c0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  2_server_method(
d7d0: 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65  ) : TLSv1_2_clie
d7e0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
d7f0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
d800: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
d810: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
d820: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d830: 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  3).    case TLS_
d840: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f  PROTO_TLS1_3:../
d850: 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69  * Use the generi
d860: 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e  c method and con
d870: 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66  straint range af
d880: 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63  ter context is c
d890: 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f  reated */..metho
d8a0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
d8b0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
d8c0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
d8d0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
d8e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  ;.#endif.    def
d8f0: 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69  ault:../* Negoti
d900: 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69  ate highest avai
d910: 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65  lable SSL/TLS ve
d920: 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64  rsion */..method
d930: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
d940: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
d950: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
d960: 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 21 64 65  ethod();.#if !de
d970: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
d980: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d990: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
d9a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d9b0: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
d9c0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
d9d0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d9e0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
d9f0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
da00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
da10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
da20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
da30: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
da40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
da50: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
da60: 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45  THOD)..off |= (E
da70: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
da80: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
da90: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
daa0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
dab0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dac0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
dad0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dae0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
daf0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
db00: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 6f  LS1_2_METHOD)..o
db10: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
db20: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
db30: 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53  TLS1_2) ? 0 : SS
db40: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29  L_OP_NO_TLSv1_2)
db50: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
db60: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
db70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
db80: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
db90: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
dba0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
dbb0: 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20  O_TLS1_3) ? 0 : 
dbc0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
dbd0: 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61  3);.#endif..brea
dbe0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  k;.    }..    ER
dbf0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
dc00: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
dc10: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b  CTX_new(method);
dc20: 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b  .    if (!ctx) {
dc30: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
dc40: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65     }..    if (ge
dc50: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
dc60: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  LE)) {..SSL_CTX_
dc70: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62  set_keylog_callb
dc80: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43  ack(ctx, KeyLogC
dc90: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
dca0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dcb0: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
dcc0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dcd0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
dce0: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f  proto == TLS_PRO
dcf0: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53  TO_TLS1_3) {..SS
dd00: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
dd10: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
dd20: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
dd30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
dd40: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
dd50: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
dd60: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  SION);.    }.#en
dd70: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63  dif..    /* Forc
dd80: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69  e cipher selecti
dd90: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76  on order by serv
dda0: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69  er */.    if (!i
ddb0: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f  sServer) {..SSL_
ddc0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
ddd0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48  ctx, SSL_OP_CIPH
dde0: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52  ER_SERVER_PREFER
ddf0: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ENCE);.    }..  
de00: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70    SSL_CTX_set_ap
de10: 70 5f 64 61 74 61 28 63 74 78 2c 20 69 6e 74 65  p_data(ctx, inte
de20: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72  rp);./* remember
de30: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
de40: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
de50: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
de60: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a   SSL_OP_ALL);./*
de70: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72   all SSL bug wor
de80: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20  karounds */.    
de90: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
dea0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
deb0: 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b  NO_COMPRESSION);
dec0: 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70  ./* disable comp
ded0: 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20  ression even if 
dee0: 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
def0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
df00: 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09  ions(ctx, off);.
df10: 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74  ./* disable prot
df20: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f  ocol versions */
df30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
df40: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
df50: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
df60: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
df70: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
df80: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
df90: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
dfa0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
dfb0: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
dfc0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
dfd0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
dfe0: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41  phers)) {..Tcl_A
dff0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e000: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73  rp, "Set ciphers
e010: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
e020: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
e030: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  r *)NULL);..SSL_
e040: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e050: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e060: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
e070: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
e080: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e090: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
e0a0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
e0b0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
e0c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e0d0: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
e0e0: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
e0f0: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
e100: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c  ar *)NULL);..SSL
e110: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e120: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
e130: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
e140: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
e150: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20  /.    if (level 
e160: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20  > -1 && level < 
e170: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  6) {../* SSL_set
e180: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20  _security_level 
e190: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
e1a0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63  security_level(c
e1b0: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20  tx, level);.    
e1c0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f  }..    /* set so
e1d0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  me callbacks */.
e1e0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e1f0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
e200: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43  b(ctx, PasswordC
e210: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
e220: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e230: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72  t_passwd_cb_user
e240: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20  data(ctx, (void 
e250: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  *)statePtr);..  
e260: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66    /* read a Diff
e270: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d  ie-Hellman param
e280: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75  eters file, or u
e290: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  se the built-in 
e2a0: 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  one */.    Tcl_D
e2b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
e2c0: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f  .#ifdef OPENSSL_
e2d0: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48  NO_DH.    if (DH
e2e0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
e2f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20  ult(interp, "DH 
e310: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72  parameter suppor
e320: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22  t not available"
e330: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
e340: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e350: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e360: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  L;.    }.#else. 
e370: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69     {..DH* dh;..i
e380: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
e390: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20  ULL) {..    BIO 
e3a0: 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20  *bio;...    bio 
e3b0: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
e3c0: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
e3d0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
e3e0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
e3f0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
e400: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
e410: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
e420: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20  uld not find DH 
e430: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22  parameters file"
e440: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
e450: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
e460: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
e470: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ULL;..    }...  
e480: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f    dh = PEM_read_
e490: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f  bio_DHparams(bio
e4a0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
e4b0: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72  LL);..    BIO_fr
e4c0: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63  ee(bio);..    Tc
e4d0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e4e0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68  s);..    if (!dh
e4f0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
e500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e510: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44  Could not read D
e520: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f  H parameters fro
e530: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  m file", (char *
e540: 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54  )NULL);...SSL_CT
e550: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
e560: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
e570: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   }..    SSL_CTX_
e580: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20  set_tmp_dh(ctx, 
e590: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65  dh);..    DH_fre
e5a0: 65 28 64 68 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  e(dh);..} else {
e5b0: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c  ..    /* Use wel
e5c0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d  l known DH param
e5d0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  eters that have 
e5e0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74  built-in support
e5f0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09   in OpenSSL */..
e600: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
e610: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78  _set_dh_auto(ctx
e620: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70  , 1)) {...Tcl_Ap
e630: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e640: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e  p, "Could not en
e650: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f  able set DH auto
e660: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
e670: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
e680: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
e690: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
e6a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
e6b0: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ..}.    }.#endif
e6c0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
e6d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
e6e0: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65      load_private
e6f0: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  _key = 0;.    if
e700: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55   (certfile != NU
e710: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
e720: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69  ate_key = 1;...i
e730: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
e740: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
e750: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c  ctx, F2N(certfil
e760: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c  e, &ds), SSL_FIL
e770: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
e780: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
e790: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
e7a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e7b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
e7c0: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
e7d0: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
e7e0: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
e7f0: 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41  .    GET_ERR_REA
e800: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
e810: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
e820: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
e830: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
e840: 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  .}..Tcl_DStringF
e850: 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d  ree(&ds);..    }
e860: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21   else if (cert !
e870: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
e880: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
e890: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
e8a0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53  e_certificate_AS
e8b0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e  N1(ctx, cert_len
e8c0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a  , cert) <= 0) {.
e8d0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e8e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
e8f0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
e900: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 20  tificate: ",... 
e910: 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f     GET_ERR_REASO
e920: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
e930: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
e940: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
e950: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
e960: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63  .    } else {..c
e970: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a  ertfile = (char*
e980: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c  )X509_get_defaul
e990: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a  t_cert_file();..
e9a0: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
e9b0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
e9c0: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c  e(ctx, certfile,
e9d0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
e9e0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30  M) <= 0) {.#if 0
e9f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
ea00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ea10: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65  unable to use de
ea20: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74  fault certificat
ea30: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
ea40: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20  le, ": ",...    
ea50: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
ea60: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
ea70: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
ea80: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
ea90: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  turn NULL;.#endi
eaa0: 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  f..}.    }..    
eab0: 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61  /* set our priva
eac0: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66  te key */.    if
ead0: 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b   (load_private_k
eae0: 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69  ey) {..if (keyfi
eaf0: 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65  le == NULL && ke
eb00: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  y == NULL) {..  
eb10: 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74    keyfile = cert
eb20: 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b  file;..}...if (k
eb30: 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  eyfile != NULL) 
eb40: 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68  {..    /* get th
eb50: 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73  e private key as
eb60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
eb70: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  is certificate *
eb80: 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69  /..    if (keyfi
eb90: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
eba0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
ebb0: 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  le;..    }...   
ebc0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
ebd0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65  _PrivateKey_file
ebe0: 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c  (ctx, F2N(keyfil
ebf0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c  e, &ds), SSL_FIL
ec00: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
ec10: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
ec20: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20  Free(&ds);.../* 
ec30: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
ec40: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
ec50: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
ec60: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f  result */...Tcl_
ec70: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ec80: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54  , NULL, TCL_STAT
ec90: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  IC);...Tcl_Appen
eca0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ecb0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70  "unable to set p
ecc0: 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22  ublic key file "
ecd0: 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a  , keyfile, " ",.
ece0: 09 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
ecf0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
ed00: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
ed10: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
ed20: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
ed30: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
ed40: 72 65 65 28 26 64 73 29 3b 0a 09 7d 20 65 6c 73  ree(&ds);..} els
ed50: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
ed60: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
ed70: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
ed80: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
ed90: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
eda0: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20  ,key_len) <= 0) 
edb0: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  {.../* flush the
edc0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
edd0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
ede0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
edf0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
ee00: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
ee10: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
ee20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ee30: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
ee40: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
ee50: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
ee60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
ee70: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
ee80: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
ee90: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
eea0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b  ..}../* Now we k
eeb0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61  now that a key a
eec0: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65  nd cert have bee
eed0: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20  n set against.. 
eee0: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78  * the SSL contex
eef0: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43  t */..if (!SSL_C
ef00: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65  TX_check_private
ef10: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20  _key(ctx)) {..  
ef20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ef30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76  lt(interp, "priv
ef40: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ate key does not
ef50: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69   match the certi
ef60: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65  ficate public ke
ef70: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61  y",....     (cha
ef80: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
ef90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
efa0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
efb0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
efc0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65     /* Set to use
efd0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
efe0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
eff0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
f000: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
f010: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20  icates. The.    
f020: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61   * verify path a
f030: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20  nd store can be 
f040: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
f050: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65  e SSL_CERT_DIR e
f060: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69  nv var. The veri
f070: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20  fy file can.    
f080: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e   * be overridden
f090: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
f0a0: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a  _FILE env var. *
f0b0: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
f0c0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
f0d0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29  erify_paths(ctx)
f0e0: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20  ) {..abort++;.  
f0f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
f100: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41  rides for the CA
f110: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64   verify path and
f120: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23   file */.    {.#
f130: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
f140: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
f150: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70  000000L..if (CAp
f160: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43  ath != NULL || C
f170: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
f180: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f190: 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f  g ds1;..    Tcl_
f1a0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31  DStringInit(&ds1
f1b0: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53  );...    if (!SS
f1c0: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
f1d0: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c  y_locations(ctx,
f1e0: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73   F2N(CAfile, &ds
f1f0: 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26  ), F2N(CApath, &
f200: 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74  ds1))) {...abort
f210: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ++;..    }..    
f220: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f230: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  &ds);..    Tcl_D
f240: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
f250: 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
f260: 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
f270: 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
f280: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
f290: 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
f2a0: 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74  e */..    /* htt
f2b0: 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65  ps://sourceforge
f2c0: 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f  .net/p/tls/bugs/
f2d0: 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58  57/ */..    /* X
f2e0: 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65  XX:TODO: Let the
f2f0: 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c   user supply val
f300: 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64  ues here instead
f310: 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   of something th
f320: 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  at exists on the
f330: 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09   filesystem */..
f340: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
f350: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
f360: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
f370: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
f380: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
f390: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
f3a0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
f3b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
f3c0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
f3d0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
f3e0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
f3f0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
f400: 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70  ..#else..if (CAp
f410: 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ath != NULL) {..
f420: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
f430: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72  _load_verify_dir
f440: 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68  (ctx, F2N(CApath
f450: 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f  , &ds))) {...abo
f460: 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rt++;..    }..  
f470: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
f480: 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28  e(&ds);..}..if (
f490: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
f4a0: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  {..    if (!SSL_
f4b0: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
f4c0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41  file(ctx, F2N(CA
f4d0: 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09  file, &ds))) {..
f4e0: 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d  .abort++;..    }
f4f0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f500: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20  gFree(&ds);...  
f510: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66    /* Set list of
f520: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20   CAs to send to 
f530: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75  client when requ
f540: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20  esting a client 
f550: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
f560: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
f570: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
f580: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
f590: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
f5a0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
f5b0: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
f5c0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
f5d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
f5e0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
f5f0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
f600: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
f610: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
f620: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
f630: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d     return ctx;.}
f640: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
f650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
f690: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d  * StatusObjCmd -
f6a0: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69  - return certifi
f6b0: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74  cate for connect
f6c0: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52  ed peer.. *. * R
f6d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
f6e0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
f6f0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
f700: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
f710: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
f720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f750: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
f760: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a  ic int.StatusObj
f770: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
f780: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
f790: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f7a0: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp,.    int obj
f7b0: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a  c,.    Tcl_Obj.*
f7c0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a  const objv[]).{.
f7d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
f7e0: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70  Ptr;.    X509 *p
f7f0: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  eer;.    Tcl_Obj
f800: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63   *objPtr;.    Tc
f810: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
f820: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65      char *channe
f830: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b  lName, *ciphers;
f840: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20  .    int mode;. 
f850: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
f860: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20  d char *proto;. 
f870: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
f880: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64  len;.    int nid
f890: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69  , res;..    dpri
f8a0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
f8b0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
f8c0: 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20   || objc > 3 || 
f8d0: 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73  (objc == 3 && !s
f8e0: 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
f8f0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d  ing(objv[1]), "-
f900: 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c  local"))) {..Tcl
f910: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f920: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
f930: 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c  ?-local? channel
f940: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
f950: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
f960: 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c    /* Get channel
f970: 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e   Id */.    chann
f980: 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  elName = Tcl_Get
f990: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a  String(objv[(obj
f9a0: 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d  c == 2 ? 1 : 2)]
f9b0: 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  );.    chan = Tc
f9c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
f9d0: 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  erp, channelName
f9e0: 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66  , &mode);.    if
f9f0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
fa00: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
fa10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
fa20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
fa30: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
fa40: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
fa50: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
fa60: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
fa70: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
fa80: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
fa90: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
faa0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
fab0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
fac0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fad0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
fae0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
faf0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
fb00: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
fb10: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
fb20: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63  har *)NULL);..Tc
fb30: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
fb40: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53  nterp, "TLS", "S
fb50: 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c  TATUS", "CHANNEL
fb60: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
fb70: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
fb80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb90: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
fba0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54  tr = (State *) T
fbb0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
fbc0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
fbd0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72  ..    /* Get cer
fbe0: 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65  tificate for pee
fbf0: 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20  r or self */.   
fc00: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
fc10: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
fc20: 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61  t_peer_certifica
fc30: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
fc40: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
fc50: 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
fc60: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
fc70: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
fc80: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30  }.    /* Get X50
fc90: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
fca0: 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65  fo */.    if (pe
fcb0: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
fcc0: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
fcd0: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
fce0: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
fcf0: 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70  .    X509_free(p
fd00: 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20  eer);..    peer 
fd10: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  = NULL;..}.    }
fd20: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
fd30: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
fd40: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
fd50: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
fd60: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
fd70: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
fd80: 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22  jPtr, "peername"
fd90: 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e  , SSL_get0_peern
fda0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
fdb0: 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  l), -1);.    LAP
fdc0: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
fdd0: 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22   objPtr, "sbits"
fde0: 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  , SSL_get_cipher
fdf0: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
fe00: 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20  ssl, NULL));..  
fe10: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
fe20: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
fe30: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
fe40: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
fe50: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
fe60: 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68  , "cipher", ciph
fe70: 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  ers, -1);..    /
fe80: 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30  * Verify the X50
fe90: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72  9 certificate pr
fea0: 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70  esented by the p
feb0: 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  eer */.    LAPPE
fec0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
fed0: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65  bjPtr, "verifyRe
fee0: 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72  sult",..X509_ver
fef0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
ff00: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
ff10: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
ff20: 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
ff30: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
ff40: 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64   mode */.    mod
ff50: 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  e = SSL_get_veri
ff60: 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  fy_mode(statePtr
ff70: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  ->ssl);.    if (
ff80: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
ff90: 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50  FY_NONE) {..LAPP
ffa0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
ffb0: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
ffc0: 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ode", "none", -1
ffd0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
ffe0: 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62  .Tcl_Obj *listOb
fff0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
10000 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
10010 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
10020 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a  _VERIFY_PEER) {.
10030 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10040 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10050 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10060 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10070 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b  bj("peer", -1));
10080 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
10090 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
100a0 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
100b0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
100c0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
100d0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
100e0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
100f0 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20  ingObj("fail if 
10100 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d  no peer cert", -
10110 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
10120 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10130 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09  CLIENT_ONCE) {..
10140 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10150 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10160 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10170 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10180 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c  j("client once",
10190 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
101a0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
101b0 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
101c0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
101d0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
101e0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
101f0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10200 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e  ingObj("post han
10210 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09  dshake", -1));..
10220 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
10230 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10240 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73  verifyMode", lis
10250 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a  tObjPtr).    }..
10260 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
10270 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20  de depth */.    
10280 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10290 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
102a0 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67  ifyDepth", SSL_g
102b0 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28  et_verify_depth(
102c0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b  statePtr->ssl));
102d0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
102e0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
102f0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
10300 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
10310 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
10320 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
10330 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
10340 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
10350 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10360 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10370 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
10380 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a  )proto, (Tcl_Siz
10390 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  e) len);.    LAP
103a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
103b0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
103c0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  ol", SSL_get_ver
103d0 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
103e0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  sl), -1);..    /
103f0 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d  * Valid for non-
10400 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e  RSA signature an
10410 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  d TLS 1.3 */.   
10420 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
10430 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
10440 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
10450 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
10460 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
10470 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
10480 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
10490 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
104a0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a  l, &nid);.    }.
104b0 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e      if (!res) {n
104c0 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50  id = 0;}.    LAP
104d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
104e0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74   objPtr, "signat
104f0 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
10500 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69  ", OBJ_nid2ln(ni
10510 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66  d), -1);..    if
10520 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10530 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
10540 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
10550 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
10560 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
10570 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
10580 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
10590 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
105a0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
105b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
105c0 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a  res) {nid = 0;}.
105d0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
105e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
105f0 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c  "signatureType",
10600 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29   OBJ_nid2ln(nid)
10610 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  , -1);..    Tcl_
10620 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10630 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
10640 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10650 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
106a0 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  . * ConnectionIn
106b0 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  foObjCmd -- retu
106c0 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  rn connection in
106d0 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  fo from OpenSSL.
106e0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
106f0 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e   *.A list of con
10700 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a  nection info.  *
10710 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10750 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
10760 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f  ic int Connectio
10770 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a 20 20 20  nInfoObjCmd(.   
10780 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
10790 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
107a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20  erp *interp,.   
107b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54   int objc,.    T
107c0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
107d0 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  jv[]).{.    Tcl_
107e0 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
107f0 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
10800 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a   set a mode on *
10810 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
10820 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
10830 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
10840 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
10850 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
10860 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
10870 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
10880 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
10890 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
108a0 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
108b0 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
108c0 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b  onst EVP_MD *md;
108d0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
108e0 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
108f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10900 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
10910 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
10920 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
10930 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10940 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
10950 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10960 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
10970 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
10980 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
10990 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
109a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
109b0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
109c0 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
109d0 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
109e0 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
109f0 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
10a00 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
10a10 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
10a20 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
10a30 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
10a40 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
10a50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
10a60 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
10a70 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
10a80 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22  me(chan),..    "
10a90 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
10aa0 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
10ab0 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
10ac0 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
10ad0 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54   "TLS", "CONNECT
10ae0 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ION", "CHANNEL",
10af0 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
10b00 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
10b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10b20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20    }..    objPtr 
10b30 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
10b40 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  (0, NULL);..    
10b50 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  /* Connection in
10b60 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  fo */.    stateP
10b70 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
10b80 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
10b90 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
10ba0 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50      ssl = stateP
10bb0 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20  tr->ssl;.    if 
10bc0 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl != NULL) {.
10bd0 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ./* connection s
10be0 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  tate */..LAPPEND
10bf0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10c00 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53  Ptr, "state", SS
10c10 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c  L_state_string_l
10c20 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  ong(ssl), -1);..
10c30 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75  ./* Get SNI requ
10c40 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d  ested server nam
10c50 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  e */..LAPPEND_ST
10c60 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10c70 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20  , "servername", 
10c80 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
10c90 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
10ca0 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
10cb0 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  e), -1);.../* Ge
10cc0 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c  t protocol */..L
10cd0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10ce0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
10cf0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76  ocol", SSL_get_v
10d00 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29  ersion(ssl), -1)
10d10 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61  ;.../* Renegotia
10d20 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  tion allowed */.
10d30 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
10d40 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
10d50 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c  enegotiation_all
10d60 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73  owed", SSL_get_s
10d70 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74  ecure_renegotiat
10d80 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c  ion_support((SSL
10d90 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20   *) ssl));.../* 
10da0 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76  Get security lev
10db0 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49  el */..LAPPEND_I
10dc0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
10dd0 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76  r, "security_lev
10de0 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63  el", SSL_get_sec
10df0 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29  urity_level(ssl)
10e00 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
10e10 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  info */..LAPPEND
10e20 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
10e30 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72  jPtr, "session_r
10e40 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73  eused", SSL_sess
10e50 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29  ion_reused(ssl))
10e60 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72  ;.../* Is server
10e70 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
10e80 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
10e90 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65  bjPtr, "is_serve
10ea0 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65  r", SSL_is_serve
10eb0 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  r(ssl));.../* Is
10ec0 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e   DTLS */..LAPPEN
10ed0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
10ee0 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22  bjPtr, "is_dtls"
10ef0 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73  , SSL_is_dtls(ss
10f00 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  l));.    }..    
10f10 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a  /* Cipher info *
10f20 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53  /.    cipher = S
10f30 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
10f40 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20  ipher(ssl);.    
10f50 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55  if (cipher != NU
10f60 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b  LL) {..char buf[
10f70 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09  BUFSIZ] = {0};..
10f80 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69  int bits, alg_bi
10f90 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  ts;.../* Cipher 
10fa0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
10fb0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10fc0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53  Ptr, "cipher", S
10fd0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
10fe0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
10ff0 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f  .../* RFC name o
11000 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
11010 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11020 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61   objPtr, "standa
11030 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49  rd_name", SSL_CI
11040 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
11050 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
11060 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61  .../* OpenSSL na
11070 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
11080 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11090 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70  erp, objPtr, "op
110a0 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45  enssl_name", OPE
110b0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65  NSSL_cipher_name
110c0 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e  (SSL_CIPHER_stan
110d0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
110e0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75  )), -1);.../* nu
110f0 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62  mber of secret b
11100 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70  its used for cip
11110 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53  her */..bits = S
11120 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
11130 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
11140 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
11150 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
11160 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73  tr, "secret_bits
11170 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  ", bits);..LAPPE
11180 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11190 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68  bjPtr, "algorith
111a0 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74  m_bits", alg_bit
111b0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  s);../* alg_bits
111c0 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
111d0 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
111e0 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
111f0 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
11200 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20  its differ,..   
11210 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
11220 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
11230 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
11240 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
11250 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a  (bits < 56) */..
11260 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68  ./* Indicates wh
11270 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74  ich SSL/TLS prot
11280 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72  ocol version fir
11290 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63  st defined the c
112a0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
112b0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
112c0 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69  jPtr, "min_versi
112d0 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  on", SSL_CIPHER_
112e0 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
112f0 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43  er), -1);.../* C
11300 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41  ipher NID */..LA
11310 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11320 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11330 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  rNID", (char *)O
11340 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
11350 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f  PHER_get_cipher_
11360 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11370 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11380 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11390 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68  "digestNID", (ch
113a0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
113b0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64  SSL_CIPHER_get_d
113c0 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72  igest_nid(cipher
113d0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
113e0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
113f0 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e  jPtr, "keyExchan
11400 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  geNID", (char *)
11410 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
11420 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64  IPHER_get_kx_nid
11430 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
11440 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11450 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75  erp, objPtr, "au
11460 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22  thenticationNID"
11470 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11480 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11490 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70  get_auth_nid(cip
114a0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
114b0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
114c0 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43  ication code - C
114d0 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65  ipher is AEAD (e
114e0 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68  .g. GCM or ChaCh
114f0 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72  a20/Poly1305) or
11500 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68   not */../* Auth
11510 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70  enticated Encryp
11520 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69  tion with associ
11530 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29  ated data (AEAD)
11540 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45   check */..LAPPE
11550 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11560 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
11570 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49  is_aead", SSL_CI
11580 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70  PHER_is_aead(cip
11590 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65  her));.../* Dige
115a0 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  st used during t
115b0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73  he SSL/TLS hands
115c0 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20  hake when using 
115d0 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09  the cipher. */..
115e0 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  md = SSL_CIPHER_
115f0 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69  get_handshake_di
11600 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c  gest(cipher);..L
11610 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11620 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64  p, objPtr, "hand
11630 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28  shake_digest", (
11640 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61  char *)EVP_MD_na
11650 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f  me(md), -1);.../
11660 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70  * Get OpenSSL-sp
11670 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49  ecific ID, not I
11680 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45  ANA ID */..LAPPE
11690 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
116a0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
116b0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
116c0 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
116d0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62  er));.../* Two-b
116e0 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74  yte ID used in t
116f0 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  he TLS protocol 
11700 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70  of the given cip
11710 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
11720 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
11730 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64  tr, "protocol_id
11740 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
11750 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c  HER_get_protocol
11760 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
11770 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72  /* Textual descr
11780 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
11790 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c  pher */..if (SSL
117a0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
117b0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
117c0 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
117d0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
117e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
117f0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
11800 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
11810 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
11820 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
11830 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
11840 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
11850 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
11860 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
11870 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
11880 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
11890 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
118a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
118b0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
118c0 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
118d0 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e  _id, *proto;..un
118e0 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66  signed char buff
118f0 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  er[SSL_MAX_MASTE
11900 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a  R_KEY_LENGTH];..
11910 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
11920 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
11930 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
11940 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61  the ALPN negotia
11950 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  tion */..SSL_SES
11960 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  SION_get0_alpn_s
11970 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c  elected(session,
11980 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b   &proto, &len2);
11990 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
119a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
119b0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70  lpn", (char *) p
119c0 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
119d0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70   len2);.../* Rep
119e0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
119f0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
11a00 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e  esult of the NPN
11a10 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
11a20 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
11a30 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72  SSL_get0_next_pr
11a40 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73  oto_negotiated(s
11a50 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65  sl, &proto, &ule
11a60 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
11a70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11a80 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29   "npn", (char *)
11a90 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
11aa0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66  e) ulen);.#endif
11ab0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20  .../* Resumable 
11ac0 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50  session */..LAPP
11ad0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11ae0 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61   objPtr, "resuma
11af0 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ble", SSL_SESSIO
11b00 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73  N_is_resumable(s
11b10 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
11b20 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
11b30 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
11b40 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50   epoch) */..LAPP
11b50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
11b60 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74  objPtr, "start_t
11b70 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ime", SSL_SESSIO
11b80 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69  N_get_time(sessi
11b90 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f  on));.../* Timeo
11ba0 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43  ut value - SSL_C
11bb0 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28  TX_get_timeout (
11bc0 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09  in seconds) */..
11bd0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11be0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d  rp, objPtr, "tim
11bf0 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49  eout", SSL_SESSI
11c00 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73  ON_get_timeout(s
11c10 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
11c20 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76  ession id - TLSv
11c30 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e  1.2 and below on
11c40 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69  ly */..session_i
11c50 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
11c60 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
11c70 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
11c80 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
11c90 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
11ca0 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  _id", session_id
11cb0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
11cc0 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
11cd0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73   context */..ses
11ce0 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
11cf0 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f  SSION_get0_id_co
11d00 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26  ntext(session, &
11d10 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
11d20 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
11d30 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
11d40 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f  context", sessio
11d50 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29  n_id, (Tcl_Size)
11d60 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73   ulen);.../* Ses
11d70 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c  sion ticket - cl
11d80 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53  ient only */..SS
11d90 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74  L_SESSION_get0_t
11da0 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26  icket(session, &
11db0 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
11dc0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
11dd0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11de0 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22  "session_ticket"
11df0 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53  , ticket, (Tcl_S
11e00 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
11e10 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
11e20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69  lifetime hint (i
11e30 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c  n seconds) */..L
11e40 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
11e50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65  p, objPtr, "life
11e60 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
11e70 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
11e80 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
11e90 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b  ion));.../* Tick
11ea0 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23  et app data */.#
11eb0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
11ec0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
11ed0 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53  000000L..SSL_SES
11ee0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
11ef0 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45  _appdata((SSL_SE
11f00 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e  SSION *) session
11f10 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32  , &ticket, &len2
11f20 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
11f30 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
11f40 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64  r, "ticket_app_d
11f50 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54  ata", ticket, (T
11f60 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
11f70 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20  #endif.../* Get 
11f80 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c  master key */..l
11f90 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  en2 = SSL_SESSIO
11fa0 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79  N_get_master_key
11fb0 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72  (session, buffer
11fc0 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52  , SSL_MAX_MASTER
11fd0 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c  _KEY_LENGTH);..L
11fe0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
11ff0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d  terp, objPtr, "m
12000 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66  aster_key", buff
12010 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  er, (Tcl_Size) l
12020 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72  en2);.../* Compr
12030 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e  ession id */..un
12040 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20  signed int id = 
12050 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12060 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73  compress_id(sess
12070 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  ion);..LAPPEND_S
12080 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12090 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f  r, "compression_
120a0 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22  id", id == 1 ? "
120b0 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20  zlib" : "none", 
120c0 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  -1);.    }..    
120d0 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
120e0 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  nfo */.    if (s
120f0 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69  sl != NULL) {.#i
12100 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f  fdef HAVE_SSL_CO
12110 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74  MPRESSION..const
12120 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f   COMP_METHOD *co
12130 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70  mp, *expn;..comp
12140 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
12150 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73  nt_compression(s
12160 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c  sl);..expn = SSL
12170 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70  _get_current_exp
12180 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c  ansion(ssl);...L
12190 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
121a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
121b0 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f  ression", comp ?
121c0 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
121d0 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65  me(comp) : "none
121e0 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ", -1);..LAPPEND
121f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12200 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22  Ptr, "expansion"
12210 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d  , expn ? SSL_COM
12220 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29  P_get_name(expn)
12230 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
12240 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53  #else..LAPPEND_S
12250 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12260 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  r, "compression"
12270 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09  , "none", -1);..
12280 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12290 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70  rp, objPtr, "exp
122a0 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c  ansion", "none",
122b0 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20   -1);.#endif.   
122c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65   }..    /* Serve
122d0 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a  r info */.    {.
122e0 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c  .long mode = SSL
122f0 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e  _CTX_get_session
12300 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74  _cache_mode(stat
12310 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61  ePtr->ctx);..cha
12320 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f  r *msg;...if (mo
12330 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12340 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20  CHE_OFF) {..    
12350 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20  msg = "off";..} 
12360 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
12370 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43  SSL_SESS_CACHE_C
12380 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73  LIENT) {..    ms
12390 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d  g = "client";..}
123a0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
123b0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
123c0 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d  SERVER) {..    m
123d0 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09  sg = "server";..
123e0 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
123f0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
12400 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73  _BOTH) {..    ms
12410 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65  g = "both";..} e
12420 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  lse {..    msg =
12430 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09   "unknown";..}..
12440 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12450 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12460 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22  sion_cache_mode"
12470 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20  , msg, -1);.    
12480 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73  }..    /* CA Lis
12490 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e  t */.    /* IF n
124a0 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d  ot a server, sam
124b0 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65  e as SSL_get0_pe
124c0 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73  er_CA_list. If s
124d0 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53  erver same as SS
124e0 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74  L_CTX_get_client
124f0 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20  _CA_list */.    
12500 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65  listPtr = Tcl_Ne
12510 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
12520 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  );.    STACK_OF(
12530 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c  X509_NAME) *ca_l
12540 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61  ist;.    if ((ca
12550 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f  _list = SSL_get_
12560 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73  client_CA_list(s
12570 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  sl)) != NULL) {.
12580 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46  .char buffer[BUF
12590 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20  SIZ];..for (int 
125a0 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35  i = 0; i < sk_X5
125b0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c  09_NAME_num(ca_l
125c0 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  ist); i++) {..  
125d0 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d    X509_NAME *nam
125e0 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  e = sk_X509_NAME
125f0 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20  _value(ca_list, 
12600 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d  i);..    if (nam
12610 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45  e) {...X509_NAME
12620 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62  _oneline(name, b
12630 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a  uffer, BUFSIZ);.
12640 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
12650 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
12660 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f  p, listPtr, Tcl_
12670 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66  NewStringObj(buf
12680 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20  fer, -1));..    
12690 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c  }..}.    }.    L
126a0 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
126b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69  p, objPtr, "caLi
126c0 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  st", listPtr);. 
126d0 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
126e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
126f0 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b  caListCount", sk
12700 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63  _X509_NAME_num(c
12710 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54  a_list));..    T
12720 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
12730 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
12740 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12750 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127a0 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62  . *. * VersionOb
127b0 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76  jCmd -- return v
127c0 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72  ersion string fr
127d0 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20  om OpenSSL.. *. 
127e0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
127f0 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
12800 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
12810 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
12820 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
12870 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f  tatic int.Versio
12880 6e 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  nObjCmd(.    TCL
12890 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
128a0 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
128b0 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 43 4c  *interp,.    TCL
128c0 5f 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a 20  _UNUSED(int) /* 
128d0 6f 62 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43 4c  objc */,.    TCL
128e0 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a 20  _UNUSED(Tcl_Obj 
128f0 2a 63 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 6a  *const *) /* obj
12900 76 20 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  v */).{.    Tcl_
12910 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20  Obj *objPtr;..  
12920 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
12930 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72  d");..    objPtr
12940 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
12950 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53  Obj(OPENSSL_VERS
12960 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a  ION_TEXT, -1);..
12970 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
12980 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
12990 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
129a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
129b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129f0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63  -----. *. * Misc
12a00 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63  ObjCmd -- misc c
12a10 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65  ommands. *. * Re
12a20 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
12a30 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
12a40 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
12a50 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
12a60 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12aa0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
12ab0 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64  c int.MiscObjCmd
12ac0 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  (.    TCL_UNUSED
12ad0 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63  (void *),.    Tc
12ae0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12af0 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  ,.    int objc,.
12b00 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e      Tcl_Obj.*con
12b10 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20  st objv[]).{.   
12b20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
12b30 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20  ar *commands [] 
12b40 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72  = { "req", "strr
12b50 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
12b60 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
12b70 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c  C_REQ, C_STRREQ,
12b80 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
12b90 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20  Tcl_Size cmd;.  
12ba0 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20    int isStr;.   
12bb0 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33   char buffer[163
12bc0 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  84];..    dprint
12bd0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
12be0 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
12bf0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
12c00 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
12c10 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64  bjv, "subcommand
12c20 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75   ?args?");..retu
12c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12c40 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
12c50 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
12c60 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
12c70 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d   commands, "comm
12c80 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21  and", 0, &cmd) !
12c90 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
12ca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12cb0 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
12cc0 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
12cd0 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d    isStr = (cmd =
12ce0 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20  = C_STRREQ);.   
12cf0 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63   switch ((enum c
12d00 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09  ommand) cmd) {..
12d10 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73  case C_REQ:..cas
12d20 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20  e C_STRREQ: {.. 
12d30 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65     EVP_PKEY *pke
12d40 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  y=NULL;..    X50
12d50 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20  9 *cert=NULL;.. 
12d60 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61     X509_NAME *na
12d70 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63  me=NULL;..    Tc
12d80 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09  l_Obj **listv;..
12d90 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73      Tcl_Size lis
12da0 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20  tc,i;...    BIO 
12db0 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20  *out=NULL;...   
12dc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43   const char *k_C
12dd0 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f  ="",*k_ST="",*k_
12de0 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f  L="",*k_O="",*k_
12df0 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a  OU="",*k_CN="",*
12e00 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20  k_Email="";..   
12e10 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70   char *keyout,*p
12e20 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20  emout,*str;..   
12e30 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72   int keysize,ser
12e40 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a  ial=0,days=365;.
12e50 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
12e60 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
12e70 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42  30000000L..    B
12e80 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c  IGNUM *bne = NUL
12e90 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61  L;..    RSA *rsa
12ea0 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09   = NULL;.#else..
12eb0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58      EVP_PKEY_CTX
12ec0 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65   *ctx = NULL;.#e
12ed0 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28  ndif...    if ((
12ee0 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63  objc<5) || (objc
12ef0 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f  >6)) {...Tcl_Wro
12f00 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
12f10 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73  , 2, objv, "keys
12f20 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74  ize keyfile cert
12f30 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09  file ?info?");..
12f40 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
12f50 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  R;..    }...    
12f60 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
12f70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12f80 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29  jv[2], &keysize)
12f90 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
12fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12fb0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65  ;..    }..    ke
12fc0 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  yout=Tcl_GetStri
12fd0 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20  ng(objv[3]);..  
12fe0 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74    pemout=Tcl_Get
12ff0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
13000 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29  ..    if (isStr)
13010 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28   {...Tcl_SetVar(
13020 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22  interp,keyout,""
13030 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61  ,0);...Tcl_SetVa
13040 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
13050 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  "",0);..    }...
13060 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29      if (objc>=6)
13070 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73   {...if (Tcl_Lis
13080 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
13090 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c  interp, objv[5],
130a0 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29   &listc, &listv)
130b0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
130c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
130d0 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
130e0 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29  ((listc%2) != 0)
130f0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
13100 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49  Result(interp,"I
13110 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20  nformation list 
13120 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e  must have even n
13130 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
13140 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ts",NULL);...   
13150 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13160 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d  R;...}...for (i=
13170 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32  0; i<listc; i+=2
13180 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63  ) {...    str=Tc
13190 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
131a0 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20  v[i]);...    if 
131b0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79  (strcmp(str,"day
131c0 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20  s")==0) {....if 
131d0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
131e0 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b  bj(interp,listv[
131f0 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c  i+1],&days)!=TCL
13200 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
13210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
13220 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13230 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61  trcmp(str,"seria
13240 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20  l")==0) {....if 
13250 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
13260 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b  bj(interp,listv[
13270 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54  i+1],&serial)!=T
13280 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
13290 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
132a0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
132b0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29  (strcmp(str,"C")
132c0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63  ==0) {....k_C=Tc
132d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
132e0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
132f0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13300 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b  (str,"ST")==0) {
13310 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74  ....k_ST=Tcl_Get
13320 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13330 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13340 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13350 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "L")==0) {....k_
13360 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  L=Tcl_GetString(
13370 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13380 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13390 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30  rcmp(str,"O")==0
133a0 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47  ) {....k_O=Tcl_G
133b0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
133c0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
133d0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
133e0 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"OU")==0) {...
133f0 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72  .k_OU=Tcl_GetStr
13400 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
13410 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13420 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e   (strcmp(str,"CN
13430 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e  ")==0) {....k_CN
13440 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
13450 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
13460 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
13470 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29  cmp(str,"Email")
13480 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69  ==0) {....k_Emai
13490 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  l=Tcl_GetString(
134a0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
134b0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54     } else {....T
134c0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
134d0 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72  erp,"Unknown par
134e0 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09  ameter",NULL);..
134f0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13500 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a  OR;...    }...}.
13510 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e  .    }..#if OPEN
13520 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
13530 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
13540 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e  ..    bne = BN_n
13550 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d  ew();..    rsa =
13560 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20   RSA_new();..   
13570 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59   pkey = EVP_PKEY
13580 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20  _new();..    if 
13590 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (bne == NULL || 
135a0 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70  rsa == NULL || p
135b0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  key == NULL || !
135c0 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c  BN_set_word(bne,
135d0 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53  RSA_F4) ||...!RS
135e0 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65  A_generate_key_e
135f0 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20  x(rsa, keysize, 
13600 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45  bne, NULL) || !E
13610 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52  VP_PKEY_assign_R
13620 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b  SA(pkey, rsa)) {
13630 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13640 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41  (pkey);.../* RSA
13650 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65  _free(rsa); free
13660 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72  d by EVP_PKEY_fr
13670 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28  ee */...BN_free(
13680 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20  bne);.#else..   
13690 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f   pkey = EVP_RSA_
136a0 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  gen((unsigned in
136b0 74 29 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20  t)keysize);..   
136c0 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f   ctx = EVP_PKEY_
136d0 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c  CTX_new(pkey,NUL
136e0 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65  L);..    if (pke
136f0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78  y == NULL || ctx
13700 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50   == NULL || !EVP
13710 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69  _PKEY_keygen_ini
13720 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50  t(ctx) ||...!EVP
13730 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73  _PKEY_CTX_set_rs
13740 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74  a_keygen_bits(ct
13750 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21  x, keysize) || !
13760 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28  EVP_PKEY_keygen(
13770 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09  ctx, &pkey)) {..
13780 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
13790 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  key);...EVP_PKEY
137a0 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
137b0 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74  #endif...Tcl_Set
137c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
137d0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
137e0 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c  private key",NUL
137f0 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  L);...return TCL
13800 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65  _ERROR;..    } e
13810 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74  lse {...if (isSt
13820 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
13830 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
13840 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
13850 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
13860 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
13870 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
13880 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  LL);...    i=BIO
13890 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
138a0 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
138b0 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
138c0 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
138d0 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
138e0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
138f0 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c  r(interp,keyout,
13900 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
13910 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
13920 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
13930 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
13940 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
13950 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
13960 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
13970 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b  e_filename(out,k
13980 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  eyout);...    PE
13990 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
139a0 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
139b0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
139c0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a  ,NULL);...    /*
139d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52   PEM_write_bio_R
139e0 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  SAPrivateKey(out
139f0 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  , rsa, NULL, NUL
13a00 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  L, 0, NULL, NULL
13a10 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f  ); */...    BIO_
13a20 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09  free_all(out);..
13a30 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74   .}....if ((cert
13a40 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55  =X509_new())==NU
13a50 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  LL) {...    Tcl_
13a60 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
13a70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
13a80 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72  ng certificate r
13a90 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09  equest",NULL);..
13aa0 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
13ab0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
13ac0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13ad0 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13ae0 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65  0L...    BN_free
13af0 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (bne);.#endif...
13b00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13b10 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  RROR;...}....X50
13b20 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65  9_set_version(ce
13b30 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e  rt,2);...ASN1_IN
13b40 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67  TEGER_set(X509_g
13b50 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28  et_serialNumber(
13b60 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09  cert),serial);..
13b70 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
13b80 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65  (X509_getm_notBe
13b90 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09  fore(cert),0);..
13ba0 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
13bb0 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66  (X509_getm_notAf
13bc0 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29  ter(cert),(long)
13bd0 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a  60*60*24*days);.
13be0 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65  ..X509_set_pubke
13bf0 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09  y(cert,pkey);...
13c00 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73  .name=X509_get_s
13c10 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
13c20 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  );....X509_NAME_
13c30 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13c40 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52  (name,"C", MBSTR
13c50 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
13c60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
13c70 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_C, -1, -1, 0)
13c80 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13c90 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13ca0 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49  ame,"ST", MBSTRI
13cb0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
13cc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
13cd0 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_ST, -1, -1, 0)
13ce0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13cf0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13d00 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e  ame,"L", MBSTRIN
13d10 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13d20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13d30 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _L, -1, -1, 0);.
13d40 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13d50 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13d60 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"O", MBSTRING_
13d70 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
13d80 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f  gned char *) k_O
13d90 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13da0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13db0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13dc0 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "OU", MBSTRING_A
13dd0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
13de0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55  ned char *) k_OU
13df0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13e00 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13e10 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13e20 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "CN", MBSTRING_A
13e30 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
13e40 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e  ned char *) k_CN
13e50 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13e60 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13e70 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13e80 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e  "Email", MBSTRIN
13e90 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13ea0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13eb0 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20  _Email, -1, -1, 
13ec0 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f  0);....X509_set_
13ed0 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
13ee0 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28  t,name);....if (
13ef0 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c  !X509_sign(cert,
13f00 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28  pkey,EVP_sha256(
13f10 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39  ))) {...    X509
13f20 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20  _free(cert);... 
13f30 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
13f40 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
13f50 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
13f60 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
13f70 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
13f80 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
13f90 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
13fa0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69  interp,"Error si
13fb0 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
13fc0 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  e",NULL);...    
13fd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13fe0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53  ;...}....if (isS
13ff0 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
14000 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
14010 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
14020 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
14030 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
14040 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
14050 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
14060 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
14070 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
14080 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
14090 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
140a0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65  SetVar(interp,pe
140b0 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  mout,buffer,0);.
140c0 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
140d0 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
140e0 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
140f0 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
14100 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
14110 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
14120 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
14130 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20  out,pemout);... 
14140 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
14150 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
14160 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
14170 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09  all(out);...}...
14180 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29  .X509_free(cert)
14190 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  ;...EVP_PKEY_fre
141a0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
141b0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
141c0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
141d0 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  L...BN_free(bne)
141e0 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a  ;.#endif..    }.
141f0 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64  .}..break;.    d
14200 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a  efault:..break;.
14210 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14220 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
14230 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14270 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
14280 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Free --. *. *.Th
14290 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
142a0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
142b0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
142c0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
142d0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
142e0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
142f0 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20  s below 1. *. * 
14300 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
14310 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
14320 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
14330 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
14340 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14380 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 23 69  ----. */.void.#i
14390 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
143a0 49 4f 4e 20 3e 20 38 0a 54 6c 73 5f 46 72 65 65  ION > 8.Tls_Free
143b0 28 20 76 6f 69 64 20 2a 62 6c 6f 63 6b 50 74 72  ( void *blockPtr
143c0 20 29 0a 23 65 6c 73 65 0a 54 6c 73 5f 46 72 65   ).#else.Tls_Fre
143d0 65 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74  e( char *blockPt
143e0 72 20 29 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 20  r ).#endif.{.   
143f0 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
14400 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63   = (State *)bloc
14410 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  kPtr;..    dprin
14420 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
14430 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
14440 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72  tePtr);.    ckfr
14450 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a  ee(blockPtr);.}.
14460 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
144b0 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a   Tls_Clean --. *
144c0 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
144d0 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
144e0 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
144f0 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
14500 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
14510 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
14520 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e  t falls below 1.
14530 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a    This should. *
14540 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68  .be called synch
14550 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20  ronously by the 
14560 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69  CloseProc, not i
14570 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61  n the. *.Eventua
14580 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b  llyFree callback
14590 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
145a0 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
145b0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
145c0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
145d0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
14620 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28  .void Tls_Clean(
14630 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
14640 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
14650 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
14660 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61  *.     * we're a
14670 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61  ssuming here tha
14680 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74  t we're single-t
14690 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a  hreaded.     */.
146a0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
146b0 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
146c0 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
146d0 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
146e0 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
146f0 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
14700 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
14710 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
14720 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14730 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65  protos) {..ckfre
14740 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  e(statePtr->prot
14750 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  os);..statePtr->
14760 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20  protos = NULL;. 
14770 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
14780 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
14790 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
147a0 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
147b0 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
147c0 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
147d0 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
147e0 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
147f0 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
14800 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
14810 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
14820 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
14830 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
14840 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65  dprintf("SSL_fre
14850 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  e(%p)", statePtr
14860 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65  ->ssl);..SSL_fre
14870 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
14880 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ;..statePtr->ssl
14890 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
148a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
148b0 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
148c0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
148d0 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
148e0 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
148f0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14900 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
14910 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
14920 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
14930 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
14940 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
14950 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
14960 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
14970 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
14980 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
14990 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
149a0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
149b0 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
149c0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
149d0 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f  r->vcmd) {..Tcl_
149e0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
149f0 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73  tePtr->vcmd);..s
14a00 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
14a10 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
14a20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
14a30 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ing");.}.../*. *
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a80 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e  ---. *. * Tls_In
14a90 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  it --. *. *.This
14aa0 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e   is a package in
14ab0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
14ac0 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69 73  cedure, which is
14ad0 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63   called. *.by Tc
14ae0 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63 6b  l when this pack
14af0 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64 64  age is to be add
14b00 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70 72  ed to an interpr
14b10 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  eter.. *. * Resu
14b20 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67  lts:  Ssl config
14b30 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a  ured and loaded.
14b40 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
14b50 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20 74  ts:. *. create t
14b60 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20  he ssl command, 
14b70 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20 63  initialize ssl c
14b80 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ontext. *. *----
14b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14bd0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52   */..#ifndef STR
14be0 49 4e 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65  INGIFY.#  define
14bf0 20 53 54 52 49 4e 47 49 46 59 28 78 29 20 53 54   STRINGIFY(x) ST
14c00 52 49 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64  RINGIFY1(x).#  d
14c10 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31  efine STRINGIFY1
14c20 28 78 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 73  (x) #x.#endif..s
14c30 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
14c40 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
14c50 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65  t[] = {.#include
14c60 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 20 20 20   "tls.tcl.h".   
14c70 20 30 78 30 30 0a 7d 3b 0a 0a 44 4c 4c 45 58 50   0x00.};..DLLEXP
14c80 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74  ORT int Tls_Init
14c90 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  (.    Tcl_Interp
14ca0 20 2a 69 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20   *interp).{.    
14cb0 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f  Tcl_CmdInfo info
14cc0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
14cd0 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 2f 2a 0a 09  Called");.../*..
14ce0 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f   * We only suppo
14cf0 72 74 20 54 63 6c 20 38 2e 36 20 6f 72 20 6e 65  rt Tcl 8.6 or ne
14d00 77 65 72 0a 09 20 2a 2f 0a 20 20 20 20 69 66 20  wer.. */.    if 
14d10 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69  (Tcl_InitStubs(i
14d20 6e 74 65 72 70 2c 20 22 38 2e 36 2d 22 2c 20 30  nterp, "8.6-", 0
14d30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
14d40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14d50 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
14d60 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20  lsLibInit(0) != 
14d70 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41  TCL_OK) {..Tcl_A
14d80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14d90 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
14da0 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
14db0 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29  brary", (char *)
14dc0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
14dd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14de0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14df0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14e00 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  , "tls::ciphers"
14e10 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c  , CiphersObjCmd,
14e20 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54   NULL, 0);.    T
14e30 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
14e40 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
14e50 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43  ::connection", C
14e60 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
14e70 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20  Cmd, NULL, 0);. 
14e80 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
14e90 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14ea0 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22  "tls::handshake"
14eb0 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  , HandshakeObjCm
14ec0 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  d, NULL, 0);.   
14ed0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
14ee0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
14ef0 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70  ls::import", Imp
14f00 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c  ortObjCmd, NULL,
14f10 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65   0);.    Tcl_Cre
14f20 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
14f30 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d  terp, "tls::unim
14f40 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f  port", UnimportO
14f50 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b  bjCmd, NULL, 0);
14f60 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14f70 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14f80 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c  , "tls::status",
14f90 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 4e   StatusObjCmd, N
14fa0 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ULL, 0);.    Tcl
14fb0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
14fc0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
14fd0 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f  version", Versio
14fe0 6e 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30  nObjCmd, NULL, 0
14ff0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15000 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15010 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c  rp, "tls::misc",
15020 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 4e 55 4c   MiscObjCmd, NUL
15030 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43  L, 0);.    Tcl_C
15040 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15050 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72  interp, "tls::pr
15060 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63  otocols", Protoc
15070 6f 6c 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c  olsObjCmd, NULL,
15080 20 30 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e   0);..    if (in
15090 74 65 72 70 29 20 7b 0a 09 69 66 20 28 54 63 6c  terp) {..if (Tcl
150a0 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c  _Eval(interp, tl
150b0 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20  sTclInitScript) 
150c0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
150d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
150e0 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
150f0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d    if (Tcl_GetCom
15100 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
15110 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69   "::tcl::build-i
15120 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a  nfo", &info)) {.
15130 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
15140 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
15150 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f  :tls::build-info
15160 22 2c 0a 09 09 69 6e 66 6f 2e 6f 62 6a 50 72 6f  ",...info.objPro
15170 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 20  c, (void *)(... 
15180 20 20 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49     PACKAGE_VERSI
15190 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59  ON "+" STRINGIFY
151a0 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49  (TLS_VERSION_UUI
151b0 44 29 0a 09 09 09 20 20 20 20 22 2e 62 6f 68 61  D)....    ".boha
151c0 67 61 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64  gan".#if defined
151d0 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64  (__clang__) && d
151e0 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d  efined(__clang_m
151f0 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20 22  ajor__)....    "
15200 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47 49  .clang-" STRINGI
15210 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72  FY(__clang_major
15220 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f  __).#if __clang_
15230 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09  minor__ < 10....
15240 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09      "0".#endif..
15250 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28  ..    STRINGIFY(
15260 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29  __clang_minor__)
15270 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
15280 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29  ned(__cplusplus)
15290 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f   && !defined(__O
152a0 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e  BJC__)....    ".
152b0 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69  cplusplus".#endi
152c0 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  f.#ifndef NDEBUG
152d0 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75 67 22  ....    ".debug"
152e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
152f0 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20  ined(__clang__) 
15300 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e  && !defined(__IN
15310 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26  TEL_COMPILER) &&
15320 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f   defined(__GNUC_
15330 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63 63 2d  _)....    ".gcc-
15340 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e  " STRINGIFY(__GN
15350 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43  UC__).#if __GNUC
15360 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09  _MINOR__ < 10...
15370 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a  .    "0".#endif.
15380 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46 59  ...    STRINGIFY
15390 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29  (__GNUC_MINOR__)
153a0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
153b0 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a  _INTEL_COMPILER.
153c0 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22 20 53  ...    ".icc-" S
153d0 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c  TRINGIFY(__INTEL
153e0 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69  _COMPILER).#endi
153f0 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d  f.#ifdef TCL_MEM
15400 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e  _DEBUG....    ".
15410 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64 69 66  memdebug".#endif
15420 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
15430 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20 22 2e  C_VER)....    ".
15440 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49 46 59  msvc-" STRINGIFY
15450 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64 69  (_MSC_VER).#endi
15460 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 4d 41  f.#ifdef USE_NMA
15470 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b  KE....    ".nmak
15480 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  e".#endif.#ifnde
15490 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49  f TCL_CFG_OPTIMI
154a0 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d  ZED....    ".no-
154b0 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66  optimize".#endif
154c0 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f  .#ifdef __OBJC__
154d0 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65 63 74  ....    ".object
154e0 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66 69 6e  ive-c".#if defin
154f0 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a  ed(__cplusplus).
15500 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c 75 73  ...    "plusplus
15510 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ".#endif.#endif.
15520 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47 5f 50  #ifdef TCL_CFG_P
15530 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20 20 22  ROFILED....    "
15540 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66  .profile".#endif
15550 0a 23 69 66 64 65 66 20 50 55 52 49 46 59 0a 09  .#ifdef PURIFY..
15560 09 09 20 20 20 20 22 2e 70 75 72 69 66 79 22 0a  ..    ".purify".
15570 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 54  #endif.#ifdef ST
15580 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09 20 20  ATIC_BUILD....  
15590 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65 6e 64    ".static".#end
155a0 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20  if...), NULL);. 
155b0 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
155c0 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 45   Tcl_PkgProvideE
155d0 78 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47  x(interp, PACKAG
155e0 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f  E_NAME, PACKAGE_
155f0 56 45 52 53 49 4f 4e 2c 20 4e 55 4c 4c 29 3b 0a  VERSION, NULL);.
15600 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15640 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e   *. *.Tls_SafeIn
15650 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d  it --. *. *.----
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15690 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64  .Standard proced
156a0 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20  ure required by 
156b0 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69  'load'.. *.Initi
156c0 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65  alizes this exte
156d0 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65  nsion for a safe
156e0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a   interpreter.. *
156f0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15720 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66  -*. *. *.Side ef
15730 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66  fects:. *..As of
15740 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20   'Tls_Init'. *. 
15750 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20  *.Result:. *..A 
15760 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72  standard Tcl err
15770 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d  or code.. *. *--
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157b0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 4c 4c 45 58  ----*. */..DLLEX
157c0 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66  PORT int Tls_Saf
157d0 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
157e0 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
157f0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
15800 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c  );.    return Tl
15810 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
15820 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15860 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74   *. *.TlsLibInit
15870 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49  ----------*. *.I
158b0 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c  nitializes SSL l
158c0 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20  ibrary once per 
158d0 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d  application. *.-
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15910 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
15920 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c  cts:. *..initial
15930 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
15940 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
15950 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d  *..none. *. *---
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15990 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ---*. */.static 
159a0 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69  int TlsLibInit(i
159b0 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  nt uninitialize)
159c0 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e   {.    static in
159d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  t initialized = 
159e0 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75  0;.    int statu
159f0 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20  s = TCL_OK;.#if 
15a00 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15a10 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15a20 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15a30 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f  .    size_t num_
15a40 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20  locks;.#endif.. 
15a50 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c     if (uninitial
15a60 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69  ize) {..if (!ini
15a70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20  tialized) {..   
15a80 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20   dprintf("Asked 
15a90 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c  to uninitialize,
15aa0 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20   but we are not 
15ab0 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a  initialized");..
15ac0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15ad0 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66  OK;..}...dprintf
15ae0 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69  ("Asked to unini
15af0 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20  tialize");..#if 
15b00 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15b10 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15b20 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15b30 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28  ..Tcl_MutexLock(
15b40 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20  &init_mx);...if 
15b50 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66  (locks) {..    f
15b60 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20  ree(locks);..   
15b70 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09   locks = NULL;..
15b80 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d      locksCount =
15b90 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69   0;..}.#endif..i
15ba0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
15bb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15bc0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15bd0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15be0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
15bf0 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
15c00 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
15c10 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
15c20 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c  .    if (initial
15c30 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66  ized) {..dprintf
15c40 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73  ("Called, but us
15c50 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65  ing cached value
15c60 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61 74  ");..return stat
15c70 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  us;.    }..    d
15c80 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
15c90 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15ca0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15cb0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15cc0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
15cd0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
15ce0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
15cf0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
15d00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
15d10 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
15d20 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
15d30 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
15d40 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
15d50 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
15d60 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
15d70 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
15d80 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
15d90 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
15da0 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
15db0 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
15dc0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
15dd0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
15de0 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
15df0 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
15e00 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
15e10 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
15e20 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
15e30 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
15e40 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
15e50 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
15e60 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
15e70 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
15e80 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
15e90 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
15ea0 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
15eb0 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
15ec0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
15ed0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
15ee0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
15ef0 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65  DS).    Tcl_Mute
15f00 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  xUnlock(&init_mx
15f10 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72  );.#endif..    r
15f20 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a  eturn status;.}.