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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 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 23 69 66 20 4f 50  ersion) {.#if OP
1a10: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1a20: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1a30: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1a40: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1a50: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1a60: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1a70: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1a80: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1a90: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1aa0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
1ab0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1ac0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
1ad0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
1ae0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1af0: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
1b00: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1b10: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1b20: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1b30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1b40: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1b50: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1b60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b70: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1b80: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1b90: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1ba0: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1bb0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1bc0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1bd0: 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22  case 0:..ver = "
1be0: 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  none";..break;. 
1bf0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72     default:..ver
1c00: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62   = "unknown";..b
1c10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c20: 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74   switch (content
1c30: 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73  _type) {.    cas
1c40: 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52  e SSL3_RT_HEADER
1c50: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65  :..type = "Heade
1c60: 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  r";..break;.    
1c70: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e  case SSL3_RT_INN
1c80: 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a  ER_CONTENT_TYPE:
1c90: 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20  ..type = "Inner 
1ca0: 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09  Content Type";..
1cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cc0: 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43  SSL3_RT_CHANGE_C
1cd0: 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70  IPHER_SPEC:..typ
1ce0: 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68  e = "Change Ciph
1cf0: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  er";..break;.   
1d00: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c   case SSL3_RT_AL
1d10: 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c  ERT:..type = "Al
1d20: 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ert";..break;.  
1d30: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48    case SSL3_RT_H
1d40: 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20  ANDSHAKE:..type 
1d50: 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09  = "Handshake";..
1d60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d70: 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54  SSL3_RT_APPLICAT
1d80: 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20  ION_DATA:..type 
1d90: 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62  = "App Data";..b
1da0: 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53  reak;.#if OPENSS
1db0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
1dc0: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20   < 0x30000000L. 
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1e00: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79      default:..ty
1e20: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  pe = "unknown";.
1e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65      }..    /* Ne
1e40: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  eds compile time
1e50: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d   option "enable-
1e60: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20  ssl-trace". */. 
1e70: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49     if ((bio = BI
1e80: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
1e90: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
1ea0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63  int n;..SSL_trac
1eb0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69  e(write_p, versi
1ec0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65  on, content_type
1ed0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c  , buf, len, ssl,
1ee0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09   (void *)bio);..
1ef0: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f  n = BIO_read(bio
1f00: 2c 20 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65  , buffer, BIO_pe
1f10: 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30  nding(bio) < 150
1f20: 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67  00 ? BIO_pending
1f30: 28 62 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a  (bio) : 14999);.
1f40: 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a  .n = (n<0) ? 0 :
1f50: 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d   n;..buffer[n] =
1f60: 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66   0;..(void)BIO_f
1f70: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f  lush(bio);..BIO_
1f80: 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a  free(bio);.   }.
1f90: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
1fa0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
1fb0: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 69  ith fn, chan, di
1fc0: 72 65 63 74 69 6f 6e 2c 20 76 65 72 73 69 6f 6e  rection, version
1fd0: 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d 65 73 73  , type, and mess
1fe0: 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  age args */.    
1ff0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
2000: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
2010: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
2020: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2030: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2040: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2050: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
2060: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20  ssage", -1));.  
2070: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2090: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
20a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20b0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
20c0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
20d0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
20e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
20f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2100: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
2110: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70  tringObj(write_p
2120: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63   ? "Sent" : "Rec
2130: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  eived", -1));.  
2140: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2150: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2160: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2170: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c  ewStringObj(ver,
2180: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2190: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
21a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
21b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
21c0: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b  gObj(type, -1));
21d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
21e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
21f0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2200: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
2210: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  uffer, -1));..  
2220: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
2230: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
2240: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2250: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
2260: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2270: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2280: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2290: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
22a0: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  Ptr);.}.#endif..
22b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2300: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
2310: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
2320: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
2330: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
2340: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
2350: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
2360: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
2370: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
2380: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
2390: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
23a0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
23b0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
23c0: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
23d0: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a  lid. Called for.
23e0: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63   *.each certific
23f0: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20  ate in the cert 
2400: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65  chain.. *. * Che
2410: 63 6b 73 3a 0a 20 2a 09 54 68 65 20 63 65 72 74  cks:. *.The cert
2420: 69 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73  ificate chain is
2430: 20 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e   checked startin
2440: 67 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65  g with the deepe
2450: 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c  st nesting level
2460: 0a 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20  . *.  (the root 
2470: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20  CA certificate) 
2480: 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72  and worked upwar
2490: 64 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20  d to the peer's 
24a0: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09  certificate.. *.
24b0: 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61  All signatures a
24c0: 72 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e  re valid, curren
24d0: 74 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e  t time is within
24e0: 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20   first and last 
24f0: 76 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20  validity time.. 
2500: 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  *.Check that the
2510: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
2520: 69 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73  issued by the is
2530: 73 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65  suer certificate
2540: 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63   issuer.. *.Chec
2550: 6b 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e  k the revocation
2560: 20 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68   status for each
2570: 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a   certificate.. *
2580: 09 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64  .Check the valid
2590: 69 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ity of the given
25a0: 20 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72   CRL and the cer
25b0: 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  t revocation sta
25c0: 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  tus.. *.Check th
25d0: 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c  e policies of al
25e0: 6c 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  l the certificat
25f0: 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a  es. *. * Args. *
2600: 09 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e  .preverify_ok in
2610: 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20  dicates whether 
2620: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2630: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73  verification pas
2640: 73 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28  sed (1) or not (
2650: 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  0). *. * Results
2660: 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20  :. *.A callback 
2670: 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63  bound to the soc
2680: 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f  ket may return o
2690: 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09  ne of:. *.    0.
26a0: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63  ..- the certific
26b0: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e  ate is deemed in
26c0: 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69  valid, send veri
26d0: 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20  fication. *.... 
26e0: 20 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74   failure alert t
26f0: 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d  o peer, and term
2700: 69 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e  inate handshake.
2710: 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68  . *.    1...- th
2720: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  e certificate is
2730: 20 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63   deemed valid, c
2740: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e  ontinue with han
2750: 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65  dshake.. *.    e
2760: 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f  mpty string.- no
2770: 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69   change to certi
2780: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
2790: 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  n. *. * Side eff
27a0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72  ects:. *.The err
27b0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
27c0: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76  rrently operativ
27d0: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20  e State is set. 
27e0: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20  *.  to a string 
27f0: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53  describing the S
2800: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66  SL negotiation f
2810: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a  ailure reason. *
2820: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
2870: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c  c int.VerifyCall
2880: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30  back(int ok, X50
2890: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78  9_STORE_CTX *ctx
28a0: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ).{.    Tcl_Obj 
28b0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c  *cmdPtr;.    SSL
28c0: 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a     *ssl..= (SSL*
28d0: 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f  )X509_STORE_CTX_
28e0: 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c  get_ex_data(ctx,
28f0: 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61   SSL_get_ex_data
2900: 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f  _X509_STORE_CTX_
2910: 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39  idx());.    X509
2920: 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f    *cert..= X509_
2930: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75  STORE_CTX_get_cu
2940: 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b  rrent_cert(ctx);
2950: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
2960: 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53  ePtr.= (State*)S
2970: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
2980: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ssl);.    Tcl_In
2990: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
29a0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
29b0: 0a 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09  .    int depth..
29c0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
29d0: 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68  _get_error_depth
29e0: 28 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65  (ctx);.    int e
29f0: 72 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  rr..= X509_STORE
2a00: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63  _CTX_get_error(c
2a10: 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  tx);..    dprint
2a20: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
2a30: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2a40: 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f  Callback: %d", o
2a50: 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  k);..    if (sta
2a60: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
2a70: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
2a80: 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75  ../* Use ok valu
2a90: 65 20 69 66 20 76 65 72 69 66 69 63 61 74 69 6f  e if verificatio
2aa0: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  n is required */
2ab0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
2ac0: 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52  vflags & SSL_VER
2ad0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
2ae0: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
2af0: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65   return ok;..} e
2b00: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72  lse {..    retur
2b10: 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  n 1;..}.    } el
2b20: 73 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e  se if (cert == N
2b30: 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55  ULL || ssl == NU
2b40: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b  LL) {..return 0;
2b50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
2b60: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62  ntf("VerifyCallb
2b70: 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61  ack: eval callba
2b80: 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  ck");..    /* Cr
2b90: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
2ba0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
2bb0: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20  an, depth, cert 
2bc0: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75  info list, statu
2bd0: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67  s, and error arg
2be0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
2bf0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2c00: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
2c10: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
2c20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c30: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c50: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  j("verify", -1))
2c60: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2c70: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2c80: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2c90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2ca0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2cb0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2cc0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2cd0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2ce0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2cf0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2d00: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20  ntObj(depth));. 
2d10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2d20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d30: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f  rp, cmdPtr, Tls_
2d40: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
2d50: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54  p, cert));.    T
2d60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2d70: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2d80: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2d90: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20  ntObj(ok));.    
2da0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2db0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2dc0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2dd0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
2de0: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  *)X509_verify_ce
2df0: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
2e00: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  err), -1));..   
2e10: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20   /* Prevent I/O 
2e20: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69  while callback i
2e30: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f  s in progress */
2e40: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2e50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2e60: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a  CL_CALLBACK; */.
2e70: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
2e80: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
2e90: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2ea0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2eb0: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c     ok = EvalCall
2ec0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2ed0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2ee0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2ef0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
2f00: 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69     dprintf("Veri
2f10: 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d  fyCallback: comm
2f20: 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22  and result = %d"
2f30: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73  , ok);..    /* s
2f40: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2f50: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  = ~(TLS_TCL_CALL
2f60: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  BACK); */.    re
2f70: 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64  turn ok;./* By d
2f80: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65  efault, leave ve
2f90: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61  rification uncha
2fa0: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a  nged. */.}.../*.
2fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
3000: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43  Error --. *. *.C
3010: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  alls callback wi
3020: 74 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  th error message
3030: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
3040: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72  ects:. *.The err
3050: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
3060: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76  rrently operativ
3070: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20  e State is set. 
3080: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20  *.  to a string 
3090: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53  describing the S
30a0: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66  SL negotiation f
30b0: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a  ailure reason. *
30c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
3110: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
3120: 2a 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74  *statePtr, const
3130: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20   char *msg) {.  
3140: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3150: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3160: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3170: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c  _Obj *cmdPtr, *l
3180: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69  istPtr;.    unsi
3190: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20  gned long err;. 
31a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
31b0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72   = msg;..    dpr
31c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
31d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
31e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
31f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
3200: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  return;..    /* 
3210: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3220: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
3230: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67  chan, and messag
3240: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3250: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3260: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3270: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
3280: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3290: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f  wStringObj("erro
32c0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
32d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
32e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
32f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
3300: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
3310: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
3320: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
3330: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d   -1));.    if (m
3340: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  sg != NULL) {..T
3350: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3360: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3370: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3380: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
3390: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
33a0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47  if ((msg = Tcl_G
33b0: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74  etString(Tcl_Get
33c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
33d0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
33e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
33f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3400: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3410: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3420: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3430: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3440: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3450: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
3460: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
3470: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
3480: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3490: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
34a0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
34b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
34c0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
34d0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
34e0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
34f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3500: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3510: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3520: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3530: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3540: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3550: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3560: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
3570: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
3580: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
3590: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
35a0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
35b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3600: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3610: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3620: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3630: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3640: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3650: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
36a0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
36b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
36c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
36d0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
36e0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
36f0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3700: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3710: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3720: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3730: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3740: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
3750: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
3760: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
3770: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
3780: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
37d0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
37e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
37f0: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3800: 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61   is needed for a
3810: 20 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65   private key whe
3820: 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20  n loading. *.or 
3830: 73 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65  storing a PEM ce
3840: 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65  rtificate with e
3850: 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73  ncryption. Evals
3860: 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72   callback. *.scr
3870: 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ipt and returns 
3880: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68  the result as th
3890: 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e  e password strin
38a0: 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20  g in buf.. *. * 
38b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
38c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
38d0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
38e0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
38f0: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
3900: 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73  s:. *.Password s
3910: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20  ize in bytes or 
3920: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  -1 for an error.
3930: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
3980: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72  atic int.Passwor
3990: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a  dCallback(char *
39a0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69  buf, int size, i
39b0: 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20  nt rwflag, void 
39c0: 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74  *udata) {.    St
39d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20  ate *statePtr.= 
39e0: 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b  (State *) udata;
39f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
3a00: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
3a10: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
3a20: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
3a30: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
3a40: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b     Tcl_Size len;
3a50: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
3a60: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
3a70: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c   If no callback,
3a80: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c   use default cal
3a90: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20  lback */.    if 
3aa0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
3ab0: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ord == NULL) {..
3ac0: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69  if (Tcl_EvalEx(i
3ad0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73  nterp, "tls::pas
3ae0: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f  sword", -1, TCL_
3af0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20  EVAL_GLOBAL) == 
3b00: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63  TCL_OK) {..    c
3b10: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
3b20: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
3b30: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74  gFromObj(Tcl_Get
3b40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3b50: 29 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69  ), &len);..    i
3b60: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69  f (len > (Tcl_Si
3b70: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09  ze) size-1) {...
3b80: 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29  len = (Tcl_Size)
3b90: 20 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a   size-1;..    }.
3ba0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
3bb0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
3bc0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c  len);..    buf[l
3bd0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20  en] = '\0';..   
3be0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65   return (int) le
3bf0: 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  n;..} else {..  
3c00: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
3c10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3c20: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3c30: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77  eval with fn, rw
3c40: 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61  flag, and size a
3c50: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
3c60: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3c70: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70  eObj(statePtr->p
3c80: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63  assword);.    Tc
3c90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3ca0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3cb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3cc0: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72  ringObj("passwor
3cd0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  d", -1));.    Tc
3ce0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3cf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3d00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3d10: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20  tObj(rwflag));. 
3d20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3d50: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29  NewIntObj(size))
3d60: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
3d70: 72 76 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74  rve((void *) int
3d80: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
3d90: 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a 29 20  eserve((void *) 
3da0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3db0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3dc0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3dd0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3de0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3df0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3e00: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3e10: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3e20: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3e30: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3e40: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3e50: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3e60: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3e70: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3e80: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3e90: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3ea0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3eb0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3ec0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3ed0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3ee0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3ef0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3f00: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72  void *) statePtr
3f10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75  );..    /* If su
3f20: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62  ccessful, pass b
3f30: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72  ack password str
3f40: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65  ing and truncate
3f50: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a   if too long */.
3f60: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
3f70: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20  TCL_OK) {..char 
3f80: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
3f90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3fa0: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52  mObj(Tcl_GetObjR
3fb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26  esult(interp), &
3fc0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e  len);..if (len >
3fd0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
3fe0: 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d  -1) {..    len =
3ff0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
4000: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28  -1;..}..strncpy(
4010: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
4020: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65  t) len);..buf[le
4030: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f  n] = '\0';..Tcl_
4040: 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29  Release((void *)
4050: 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72   interp);..retur
4060: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20  n (int) len;.   
4070: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
4080: 73 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65  se((void *) inte
4090: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rp);.    return 
40a0: 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  -1;.}.../*. *---
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43  . *. * Session C
4100: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65  allback for Clie
4110: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  nts --. *. *.Cal
4120: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73  led when a new s
4130: 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20  ession is added 
4140: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e  to the cache. In
4150: 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73   TLS 1.3. *.this
4160: 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64   may be received
4170: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
4180: 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68  after the handsh
4190: 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c  ake. For. *.earl
41a0: 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68  ier versions, th
41b0: 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69  is will be recei
41c0: 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68  ved during the h
41d0: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69  andshake.. *.Thi
41e0: 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72  s is the preferr
41f0: 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e  ed way to obtain
4200: 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73   a resumable ses
4210: 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  sion.. *. * Resu
4220: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4230: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4240: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4250: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4260: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4270: 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72  es:. *.0 = error
4280: 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77   where session w
4290: 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65  ill be immediate
42a0: 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ly removed from 
42b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
42c0: 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65  he.. *.1 = succe
42d0: 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74  ss where app ret
42e0: 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20  ains session in 
42f0: 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61  session cache, a
4300: 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c  nd must call SSL
4310: 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20  _SESSION_free() 
4320: 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a  when done.. *. *
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
4380: 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61  nt.SessionCallba
4390: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c  ck(SSL *ssl, SSL
43a0: 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f  _SESSION *sessio
43b0: 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  n) {.    State *
43c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
43d0: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
43e0: 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b  ata((SSL *)ssl);
43f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4400: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4410: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4420: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4430: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
4440: 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74  ned char *ticket
4450: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
4460: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
4470: 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f  on_id;.    size_
4480: 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69  t len2;.    unsi
4490: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a  gned int ulen;..
44a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
44b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
44c0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
44d0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
44e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
44f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4500: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  K;.    } else if
4510: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ssl == NULL) {
4520: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4530: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4540: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4550: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4560: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
4570: 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73  n, session id, s
4580: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61  ession ticket, a
4590: 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73  nd lifetime args
45a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
45b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
45c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
45d0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
45e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
45f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4600: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4610: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20  gObj("session", 
4620: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
4630: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4640: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4650: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
4660: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
4670: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
4680: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
4690: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69  );..    /* Sessi
46a0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73  on id */.    ses
46b0: 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
46c0: 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
46d0: 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20  sion, &ulen);.  
46e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
46f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4700: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4710: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
4720: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
4730: 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20  Size) ulen));.. 
4740: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69     /* Session ti
4750: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
4760: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
4770: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ket(session, &ti
4780: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20  cket, &len2);.  
4790: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
47a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
47b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
47c0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
47d0: 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
47e0: 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f  ) len2));..    /
47f0: 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d  * Lifetime - num
4800: 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a  ber of seconds *
4810: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
4820: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4830: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4840: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28  Tcl_NewLongObj((
4850: 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f  long) SSL_SESSIO
4860: 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66  N_get_ticket_lif
4870: 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69  etime_hint(sessi
4880: 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  on)));..    /* E
4890: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
48a0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
48b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
48c0: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61  Ptr);.    EvalCa
48d0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
48e0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
48f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
4900: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4910: 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30  .    /* Return 0
4920: 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73   for now until s
4930: 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20  ession handling 
4940: 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
4950: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c     return 0;.}..
4960: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
49b0: 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f  ALPN Callback fo
49c0: 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50  r Servers and NP
49d0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  N Callback for C
49e0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
49f0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c  Perform protocol
4a00: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20   (http/1.1, h2, 
4a10: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74  h3, etc.) select
4a20: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69  ion for the. *.i
4a30: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
4a40: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72  on. Called after
4a50: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65   Hello and serve
4a60: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09  r callbacks.. *.
4a70: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73  Where 'out' is s
4a80: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
4a90: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65   and 'in' is the
4aa0: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64   peer advertised
4ab0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73   list.. *. * Res
4ac0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
4ad0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4ae0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
4af0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
4b00: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4b10: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
4b20: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20  XT_ERR_OK: ALPN 
4b30: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
4b40: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
4b50: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
4b60: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
4b70: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72  LERT_FATAL: Ther
4b80: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70  e was no overlap
4b90: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69   between the cli
4ba0: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70  ent's. *.    sup
4bb0: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74  plied list and t
4bc0: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67  he server config
4bd0: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  uration. The con
4be0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  nection will be 
4bf0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f  aborted.. *.SSL_
4c00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4c10: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  : ALPN protocol 
4c20: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e  not selected, e.
4c30: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41  g., because no A
4c40: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f  LPN. *.    proto
4c50: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75  cols are configu
4c60: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e  red for this con
4c70: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  nection. The con
4c80: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4c90: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4ce0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43  static int.ALPNC
4cf0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
4d00: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
4d10: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
4d20: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c  igned char *outl
4d30: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en,..const unsig
4d40: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e  ned char *in, un
4d50: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e  signed int inlen
4d60: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
4d70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4d80: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
4d90: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
4da0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
4db0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
4dc0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
4dd0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  ;.    int code, 
4de0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  res;..    dprint
4df0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
4e00: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
4e10: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
4e20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4e30: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4e40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4e50: 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20  Select protocol 
4e60: 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73  */.    if (SSL_s
4e70: 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  elect_next_proto
4e80: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
4e90: 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c  **) out, outlen,
4ea0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4eb0: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  s, statePtr->pro
4ec0: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e  tos_len,..in, in
4ed0: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f  len) == OPENSSL_
4ee0: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20  NPN_NEGOTIATED) 
4ef0: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e  {../* Match foun
4f00: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f  d */..res = SSL_
4f10: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4f20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
4f30: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f  OPENSSL_NPN_NO_O
4f40: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72  VERLAP = No over
4f50: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73  lap, so use firs
4f60: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65  t item from clie
4f70: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74  nt protocol list
4f80: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4f90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4fa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4fb0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
4fc0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4fd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b  ) {..return res;
4fe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4ff0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
5000: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
5010: 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74  han, depth, cert
5020: 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74   info list, stat
5030: 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72  us, and error ar
5040: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
5050: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
5060: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
5070: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
5080: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5090: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
50a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
50b0: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b  bj("alpn", -1));
50c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
50d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
50e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
50f0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5100: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5110: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5120: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5130: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5140: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5150: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5160: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e  ewStringObj((con
5170: 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c  st char *) *out,
5180: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5190: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
51a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
51b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  tr, Tcl_NewBoole
51c0: 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c  anObj(res == SSL
51d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29  _TLSEXT_ERR_OK))
51e0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
51f0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
5200: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
5210: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5220: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
5230: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
5240: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
5250: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
5260: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5270: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5280: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5290: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
52a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
52b0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
52c0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
52d0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
52e0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  L;.    }.    Tcl
52f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
5300: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  dPtr);.    retur
5310: 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n res;.}.../*. *
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74  ---. *. * Advert
5370: 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61  ise Protocols Ca
5380: 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20  llback for Next 
5390: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
53a0: 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65  tion (NPN) in Se
53b0: 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a  rverHello --. *.
53c0: 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.called when a
53d0: 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64   TLS server need
53e0: 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70  s a list of supp
53f0: 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20  orted protocols 
5400: 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74  for Next. *.Prot
5410: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e  ocol Negotiation
5420: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5430: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
5440: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a  ide effects:. *.
5450: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
5460: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5470: 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f  RR_OK: NPN proto
5480: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68  col selected. Th
5490: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
54a0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
54b0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
54c0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   NPN protocol no
54d0: 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  t selected. The 
54e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
54f0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5540: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
5550: 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e  N.static int.NPN
5560: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
5570: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75  SL *ssl, const u
5580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f  nsigned char **o
5590: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ut, unsigned int
55a0: 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a   *outlen, void *
55b0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
55c0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
55d0: 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64  ate*)arg;..    d
55e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
55f0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5600: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5610: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5620: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5630: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5640: 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f    /* Set protoco
5650: 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  ls list */.    i
5660: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
5670: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tos != NULL) {..
5680: 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d  *out = statePtr-
5690: 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65  >protos;..*outle
56a0: 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72  n = statePtr->pr
56b0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20  otos_len;.    } 
56c0: 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e  else {..*out = N
56d0: 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20  ULL;..*outlen = 
56e0: 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54  0;..return SSL_T
56f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5700: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
5710: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5720: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a  _OK;.}.#endif...
5730: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
5780: 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  NI Callback for 
5790: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
57a0: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d  .Perform server-
57b0: 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d  side SNI hostnam
57c0: 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65  e selection afte
57d0: 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20  r receiving SNI 
57e0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20  extension. *.in 
57f0: 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61  Client Hello. Ca
5800: 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f  lled after hello
5810: 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65   callback but be
5820: 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61  fore ALPN callba
5830: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
5840: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
5850: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5860: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
5870: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
5880: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
5890: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  :. *.SSL_TLSEXT_
58a0: 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74  ERR_OK: SNI host
58b0: 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64  name is accepted
58c0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
58d0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
58e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
58f0: 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68  ERT_FATAL: SNI h
5900: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5910: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e  ccepted. The con
5920: 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69  nection. *.    i
5930: 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75  s aborted. Defau
5940: 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20  lt for alert is 
5950: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
5960: 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c  ZED_NAME.. *.SSL
5970: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5980: 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68  T_WARNING: SNI h
5990: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
59a0: 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67  ccepted, warning
59b0: 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65   alert. *.    se
59c0: 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65  nt (not supporte
59d0: 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54  d in TLSv1.3). T
59e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
59f0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
5a00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5a10: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5a20: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61  s not accepted a
5a30: 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64  nd not acknowled
5a40: 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e  ged,. *.    e.g.
5a50: 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20   if SNI has not 
5a60: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e  been configured.
5a70: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5a80: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a  continues.. *. *
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
5ae0: 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63  nt.SNICallback(c
5af0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69  onst SSL *ssl, i
5b00: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20  nt *alert, void 
5b10: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
5b20: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
5b30: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
5b40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5b50: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
5b60: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
5b70: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
5b80: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20  nt code, res;.  
5b90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
5ba0: 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  rvername = NULL;
5bb0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
5bc0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
5bd0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
5be0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
5bf0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5c00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5c10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
5c20: 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31   works for TLS 1
5c30: 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a  .2 and earlier *
5c40: 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  /.    servername
5c50: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65   = SSL_get_serve
5c60: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
5c70: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
5c80: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21  name);.    if (!
5c90: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65  servername || se
5ca0: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27  rvername[0] == '
5cb0: 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  \0') {..return S
5cc0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5cd0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5ce0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
5cf0: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
5d00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5d10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5d20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5d30: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
5d40: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
5d50: 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65   chan, and serve
5d60: 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20  r name args */. 
5d70: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5d80: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5d90: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5da0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5db0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5dc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5dd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69  ewStringObj("sni
5de0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
5df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5e00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5e10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
5e20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
5e30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
5e40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
5e50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5e60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5e70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5e80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5e90: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c  Obj(servername ,
5ea0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45   -1));..    /* E
5eb0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
5ec0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
5ed0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
5ee0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
5ef0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
5f00: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
5f10: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
5f20: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5f30: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5f40: 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72  _WARNING;..*aler
5f50: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43  t = SSL_AD_UNREC
5f60: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a  OGNIZED_NAME; /*
5f70: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   Not supported b
5f80: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  y TLS 1.3 */.   
5f90: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5fa0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
5fb0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5fc0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
5fd0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5fe0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
5ff0: 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  L;..*alert = SSL
6000: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
6010: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
6020: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
6030: 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  .3 */.    }.    
6040: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6050: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
6060: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
6070: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69  ------. *. * Cli
60c0: 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61  entHello Handsha
60d0: 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ke Callback for 
60e0: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
60f0: 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20  .Used by server 
6100: 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73  to examine the s
6110: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63  erver name indic
6120: 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65  ation (SNI) exte
6130: 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65  nsion. *.provide
6140: 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20  d by the client 
6150: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65  in order to sele
6160: 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ct an appropriat
6170: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  e certificate to
6180: 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64  . *.present, and
6190: 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66   make other conf
61a0: 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74  iguration adjust
61b0: 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74  ments relevant t
61c0: 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a  o that server. *
61d0: 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f  .name and its co
61e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69  nfiguration. Thi
61f0: 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70  s includes swapp
6200: 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f  ing out the asso
6210: 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54  ciated. *.SSL_CT
6220: 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66  X pointer, modif
6230: 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27  ying the server'
6240: 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74  s list of permit
6250: 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73  ted TLS versions
6260: 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68  ,. *.changing th
6270: 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65  e server's ciphe
6280: 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e  r list in respon
6290: 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  se to the client
62a0: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20  's cipher list, 
62b0: 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62  etc.. *.Called b
62c0: 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c  efore SNI and AL
62d0: 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a  PN callbacks.. *
62e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
62f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
6300: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
6310: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
6320: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
6330: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
6340: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6350: 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74  RETRY: suspend t
6360: 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e  he handshake, an
6370: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  d the handshake 
6380: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
6390: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
63a0: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
63b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c  ELLO_ERROR: fail
63c0: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63  ure, terminate c
63d0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61  onnection. Set a
63e0: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f  lert to error co
63f0: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  de.. *.SSL_CLIEN
6400: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a  T_HELLO_SUCCESS:
6410: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d   success. *. *--
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
6470: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53  .HelloCallback(S
6480: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
6490: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
64a0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
64b0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
64c0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
64d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
64e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
64f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
6500: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
6510: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73  e, res;.    cons
6520: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61  t char *serverna
6530: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  me;.    const un
6540: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
6550: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20      size_t len, 
6560: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20  remaining;..    
6570: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6580: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
6590: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
65a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
65b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
65c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
65d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
65e0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53  (ssl == (const S
65f0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67  SL *)NULL || arg
6600: 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c   == (void *)NULL
6610: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
6620: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6630: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6640: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20  * Get names */. 
6650: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65     if (!SSL_clie
6660: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78  nt_hello_get0_ex
6670: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59  t(ssl, TLSEXT_TY
6680: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20  PE_server_name, 
6690: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20  &p, &remaining) 
66a0: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  || remaining <= 
66b0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
66c0: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54  SL_R_SSLV3_ALERT
66d0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54  _ILLEGAL_PARAMET
66e0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ER;..return SSL_
66f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6700: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6710: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65  * Extract the le
6720: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70  ngth of the supp
6730: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d  lied list of nam
6740: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d  es. */.    len =
6750: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6760: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6770: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6780: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29   2 != remaining)
6790: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
67a0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
67b0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
67c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
67d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
67e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
67f0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20  ining = len;..  
6800: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e    /* The list in
6810: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68   practice only h
6820: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d  as a single elem
6830: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20  ent, so we only 
6840: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72  consider the fir
6850: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  st one. */.    i
6860: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  f (remaining == 
6870: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53  0 || *p++ != TLS
6880: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
6890: 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72  t_name) {..*aler
68a0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
68b0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
68c0: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  RROR;..return SS
68d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
68e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
68f0: 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20  remaining--;..  
6900: 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20    /* Now we can 
6910: 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74  finally pull out
6920: 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20   the byte array 
6930: 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20  with the actual 
6940: 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  hostname. */.   
6950: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c   if (remaining <
6960: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  = 2) {..*alert =
6970: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6980: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6990: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
69a0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
69b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  R;.    }.    len
69c0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29   = (*(p++) << 8)
69d0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70  ;.    len += *(p
69e0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e  ++);.    if (len
69f0: 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67   + 2 > remaining
6a00: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6a10: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6a20: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6a30: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6a40: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6a50: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6a60: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73  ing = len;.    s
6a70: 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e  ervername = (con
6a80: 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20  st char *)p;..  
6a90: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
6aa0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
6ab0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73   fn, chan, and s
6ac0: 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20  erver name args 
6ad0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
6ae0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
6af0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
6b00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6b10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6b20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
6b30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6b40: 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20  "hello", -1));. 
6b50: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6b60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6b70: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
6b80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6b90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
6ba0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
6bb0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
6bc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6bd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6be0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
6bf0: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72  StringObj(server
6c00: 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29  name, (Tcl_Size)
6c10: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   len));..    /* 
6c20: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
6c30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
6c40: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
6c50: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
6c60: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
6c70: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
6c80: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
6c90: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6ca0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
6cb0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TRY;..*alert = S
6cc0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6cd0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b  _USER_CANCELLED;
6ce0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6cf0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
6d00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
6d10: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20  ELLO_SUCCESS;.  
6d20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
6d30: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6d40: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72  LO_ERROR;..*aler
6d50: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6d60: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6d70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6d80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6d90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
6da0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6dc0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73  ***/./* Commands
6dd0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6df0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6e40: 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64   * CiphersObjCmd
6e50: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62   -- list availab
6e60: 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a  le ciphers. *. *
6e70: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
6e80: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
6e90: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a  ocess the "tls::
6ea0: 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64  ciphers" command
6eb0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
6ec0: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62  lable ciphers, b
6ed0: 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63  ased upon protoc
6ee0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a  ol selected.. *.
6ef0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
6f00: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
6f10: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  sult list.. *. *
6f20: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6f30: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64  *.constructs and
6f40: 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f   destroys SSL co
6f50: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
6f60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
6fb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74  const char *prot
6fc0: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  ocols[] = {.    
6fd0: 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20  "ssl2", "ssl3", 
6fe0: 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22  "tls1", "tls1.1"
6ff0: 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73  , "tls1.2", "tls
7000: 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e  1.3", NULL.};.en
7010: 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20  um protocol {.  
7020: 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f    TLS_SSL2, TLS_
7030: 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20  SSL3, TLS_TLS1, 
7040: 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f  TLS_TLS1_1, TLS_
7050: 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_2, TLS_TLS1
7060: 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a  _3, TLS_NONE.};.
7070: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68  .static int.Ciph
7080: 65 72 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  ersObjCmd(.    T
7090: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
70a0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
70b0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p *interp,.    i
70c0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c  nt objc,.    Tcl
70d0: 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj.*const objv
70e0: 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []).{.    Tcl_Ob
70f0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  j *objPtr = NULL
7100: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
7110: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tx = NULL;.    S
7120: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  SL *ssl = NULL;.
7130: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c      STACK_OF(SSL
7140: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20  _CIPHER) *sk;.  
7150: 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 49    char buf[BUFSI
7160: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65  Z];.    int inde
7170: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20  x, verbose = 0, 
7180: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20  use_supported = 
7190: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  0;.    const SSL
71a0: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b  _METHOD *method;
71b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
71c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
71d0: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20   ((objc < 2) || 
71e0: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54  (objc > 4)) {..T
71f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7200: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7210: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62   "protocol ?verb
7220: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f  ose? ?supported?
7230: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
7240: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7250: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
7260: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
7270: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63   objv[1], protoc
7280: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  ols, "protocol",
7290: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
72a0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
72b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
72c0: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
72d0: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 2) && Tcl_GetB
72e0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
72f0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
7300: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f  verbose) != TCL_
7310: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7320: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7330: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33     if ((objc > 3
7340: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
7350: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7360: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65  p, objv[3], &use
7370: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54  _supported) != T
7380: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
7390: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
73a0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
73b0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73  _error();..    s
73c0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
73d0: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20  tocol)index) {. 
73e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32     case TLS_SSL2
73f0: 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  :.#if OPENSSL_VE
7400: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
7410: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
7420: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
7430: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7440: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 54 63 6c  SL_NO_SSL2)..Tcl
7450: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7460: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
7470: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7480: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7490: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
74a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
74b0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74  RROR;.#else..met
74c0: 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68  hod = SSLv2_meth
74d0: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
74e0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
74f0: 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e  _SSL3:.#if defin
7500: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
7510: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7520: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
7530: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7540: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f  L3_METHOD)..Tcl_
7550: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7560: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7570: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7580: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7590: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
75a0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
75b0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68  ROR;.#else..meth
75c0: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f  od = SSLv3_metho
75d0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
75e0: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  if.    case TLS_
75f0: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
7600: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
7610: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7620: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7630: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7640: 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41  1_METHOD)..Tcl_A
7650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7660: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
7670: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
7680: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
7690: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
76a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
76b0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f  OR;.#else..metho
76c0: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64  d = TLSv1_method
76d0: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
76e0: 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54  f.    case TLS_T
76f0: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_1:.#if defin
7700: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
7710: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7720: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  _NO_TLS1_1) || d
7730: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7740: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
7750: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7760: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
7770: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
7780: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7790: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
77a0: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
77b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
77c0: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31  ..method = TLSv1
77d0: 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _1_method(); bre
77e0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  ak;.#endif.    c
77f0: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a  ase TLS_TLS1_2:.
7800: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7810: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
7820: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7830: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
7840: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7850: 32 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41  2_METHOD)..Tcl_A
7860: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7870: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
7880: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
7890: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
78a0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
78b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
78c0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f  OR;.#else..metho
78d0: 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68  d = TLSv1_2_meth
78e0: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
78f0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
7900: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66  _TLS1_3:.#if def
7910: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
7920: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7930: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 54  SL_NO_TLS1_3)..T
7940: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7950: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7960: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7970: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7980: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ted", (char *)NU
7990: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
79a0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d  _ERROR;.#else..m
79b0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68  ethod = TLS_meth
79c0: 6f 64 28 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  od();..SSL_CTX_s
79d0: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72  et_min_proto_ver
79e0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
79f0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f  _VERSION);..SSL_
7a00: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
7a10: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
7a20: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7a30: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
7a40: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 6d 65 74     default:..met
7a50: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64  hod = TLS_method
7a60: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  ();..break;.    
7a70: 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c  }..    ctx = SSL
7a80: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29  _CTX_new(method)
7a90: 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d  ;.    if (ctx ==
7aa0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
7ab0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7ac0: 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  p, GET_ERR_REASO
7ad0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
7ae0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
7af0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7b00: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28    ssl = SSL_new(
7b10: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73  ctx);.    if (ss
7b20: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  l == NULL) {..Tc
7b30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7b40: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52  nterp, GET_ERR_R
7b50: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
7b60: 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58  )NULL);..SSL_CTX
7b70: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
7b80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7b90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
7ba0: 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20   list and order 
7bb0: 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74  as would be sent
7bc0: 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c   in a ClientHell
7bd0: 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62  o or all availab
7be0: 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20  le ciphers */.  
7bf0: 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72    if (use_suppor
7c00: 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c  ted) {..sk = SSL
7c10: 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f  _get1_supported_
7c20: 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20  ciphers(ssl);.  
7c30: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d    } else {..sk =
7c40: 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73   SSL_get_ciphers
7c50: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  (ssl);.    }..  
7c60: 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c    if (sk != NULL
7c70: 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73  ) {..if (!verbos
7c80: 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20  e) {..    const 
7c90: 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f  char *cp;..    o
7ca0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
7cb0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
7cc0: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
7cd0: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
7ce0: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
7cf0: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
7d00: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
7d10: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
7d20: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
7d30: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
7d40: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70  tinue;..../* cip
7d50: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e  her name or (NON
7d60: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c  E) */...cp = SSL
7d70: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
7d80: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d  (c);...if (cp ==
7d90: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09   NULL) break;...
7da0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
7db0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
7dc0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
7dd0: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31  StringObj(cp, -1
7de0: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65  ));..    }...} e
7df0: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74  lse {..    objPt
7e00: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
7e10: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20  gObj("",0);..   
7e20: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7e30: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7e40: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7e50: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7e60: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7e70: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7e80: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7e90: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7ea0: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20  ;..../* textual 
7eb0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
7ec0: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69  he cipher */...i
7ed0: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
7ee0: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66  scription(c, buf
7ef0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21  , sizeof(buf)) !
7f00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  = NULL) {...    
7f10: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
7f20: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63  objPtr, buf, (Tc
7f30: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62  l_Size) strlen(b
7f40: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  uf));...} else {
7f50: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7f60: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22  dToObj(objPtr, "
7f70: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a  UNKNOWN\n", 8);.
7f80: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69  ..}..    }..}..i
7f90: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64  f (use_supported
7fa0: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f  ) {..    sk_SSL_
7fb0: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b  CIPHER_free(sk);
7fc0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  ..}.    }.    SS
7fd0: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20  L_free(ssl);.   
7fe0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
7ff0: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  x);..    Tcl_Set
8000: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8010: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
8020: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
8030: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8080: 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64   ProtocolsObjCmd
8090: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62   -- list availab
80a0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a  le protocols. *.
80b0: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
80c0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
80d0: 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73  process the "tls
80e0: 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d  ::protocols" com
80f0: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20  mand. *.to list 
8100: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8110: 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ols.. *. * Resul
8120: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
8130: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73  d Tcl result lis
8140: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
8150: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  fects:. *.none. 
8160: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
81b0: 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c  tic int.Protocol
81c0: 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  sObjCmd(.    TCL
81d0: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
81e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
81f0: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74  *interp,.    int
8200: 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f   objc,.    Tcl_O
8210: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8220: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
8230: 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70  *objPtr;..    dp
8240: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
8250: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
8260: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 1) {..Tcl_Wron
8270: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8280: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09   1, objv, "");..
8290: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
82a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
82b0: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
82c0: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
82d0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
82e0: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  NULL);..#if OPEN
82f0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
8300: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
8310: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
8320: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
8330: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
8340: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  2).    Tcl_ListO
8350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8360: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8380: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53  (protocols[TLS_S
8390: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  SL2], -1));.#end
83a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
83b0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
83c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
83d0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
83e0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
83f0: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  3_METHOD).    Tc
8400: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8410: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8420: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8430: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
8440: 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29  s[TLS_SSL3], -1)
8450: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8460: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
8470: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8480: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
8490: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
84a0: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
84b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
84c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
84d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
84e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
84f0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
8500: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  1], -1));.#endif
8510: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
8520: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
8530: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8540: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
8550: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8560: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_1_METHOD).  
8570: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8580: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8590: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
85a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
85b0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31  ocols[TLS_TLS1_1
85c0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
85d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
85e0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
85f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8600: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
8610: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8620: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
8630: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8640: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8650: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8660: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8670: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d  cols[TLS_TLS1_2]
8680: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8690: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
86a0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
86b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
86c0: 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69  S1_3).    Tcl_Li
86d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
86e0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
86f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8700: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
8710: 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b  S_TLS1_3], -1));
8720: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c  .#endif..    Tcl
8730: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
8740: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
8750: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
8760: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
8770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
87b0: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62  *. * HandshakeOb
87c0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
87d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
87e0: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65  ed to verify whe
87f0: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  ther the handsha
8800: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20  ke is complete. 
8810: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20  *.or not.. *. * 
8820: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
8830: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
8840: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73  t. 1 means hands
8850: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30  hake complete, 0
8860: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a   means pending..
8870: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8880: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65  ts:. *.May force
8890: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
88a0: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a   to take place..
88b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
8900: 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61  atic int Handsha
8910: 6b 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  keObjCmd(.    TC
8920: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
8930: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
8940: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e   *interp,.    in
8950: 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f  t objc,.    Tcl_
8960: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8970: 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]).{.    Tcl_Cha
8980: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
8990: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
89a0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
89b0: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
89c0: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
89d0: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
89e0: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
89f0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
8a00: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
8a10: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
8a20: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
8a30: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
8a40: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
8a50: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
8a60: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
8a70: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
8a80: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
8a90: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
8aa0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8ab0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
8ac0: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  );..    chan = T
8ad0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
8ae0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
8af0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55  ing(objv[1]), NU
8b00: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
8b10: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
8b20: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
8b30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8b40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
8b50: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
8b60: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
8b70: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
8b80: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
8b90: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
8ba0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
8bb0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
8bc0: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
8bd0: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
8be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8bf0: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
8c00: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
8c10: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
8c20: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
8c30: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
8c40: 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74  )NULL);..Tcl_Set
8c50: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
8c60: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48  , "TLS", "HANDSH
8c70: 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  AKE", "CHANNEL",
8c80: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
8c90: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
8ca0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8cb0: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
8cc0: 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f   = (State *)Tcl_
8cd0: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
8ce0: 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
8cf0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
8d00: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  ing Tls_WaitForC
8d10: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65  onnect");.    re
8d20: 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43  t = Tls_WaitForC
8d30: 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c  onnect(statePtr,
8d40: 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64   &err, 1);.    d
8d50: 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74  printf("Tls_Wait
8d60: 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72  ForConnect retur
8d70: 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a  ned: %i", ret);.
8d80: 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30  .    if (ret < 0
8d90: 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e   && ((statePtr->
8da0: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f  flags & TLS_TCL_
8db0: 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d  ASYNC) && (err =
8dc0: 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64  = EAGAIN))) {..d
8dd0: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65  printf("Async se
8de0: 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41  t and err = EAGA
8df0: 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a  IN");..ret = 0;.
8e00: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72      } else if (r
8e10: 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20  et < 0) {..long 
8e20: 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20  result;..errStr 
8e30: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b  = statePtr->err;
8e40: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c  ..Tcl_ResetResul
8e50: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f  t(interp);..Tcl_
8e60: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a  SetErrno(err);..
8e70: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20  .if (!errStr || 
8e80: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20  (*errStr == 0)) 
8e90: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20  {..    errStr = 
8ea0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
8eb0: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c  nterp);..}...Tcl
8ec0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8ed0: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65  terp, "handshake
8ee0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53   failed: ", errS
8ef0: 74 72 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  tr, (char *)NULL
8f00: 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20  );..if ((result 
8f10: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  = SSL_get_verify
8f20: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
8f30: 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f  ->ssl)) != X509_
8f40: 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c  V_OK) {..    Tcl
8f50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8f60: 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c  terp, " due to \
8f70: 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f  "", X509_verify_
8f80: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
8f90: 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c  g(result), "\"",
8fa0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
8fb0: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  .}..Tcl_SetError
8fc0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8fd0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8fe0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
8ff0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e   *)NULL);..dprin
9000: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43  tf("Returning TC
9010: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e  L_ERROR with han
9020: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25  dshake failed: %
9030: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65  s", errStr);..re
9040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9050: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
9060: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20   (err != 0) {.. 
9070: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
9080: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20  an error with a 
9090: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68  completed handsh
90a0: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20  ake: err = %i", 
90b0: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20  err);..}..ret = 
90c0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  1;.    }..    dp
90d0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
90e0: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74   TCL_OK with dat
90f0: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b  a \"%i\"", ret);
9100: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
9110: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
9120: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29  l_NewIntObj(ret)
9130: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9140: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
91a0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
91b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
91c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
91d0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
91e0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
91f0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
9200: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
9210: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
9220: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
9230: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
9240: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
9250: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
9260: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
9270: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
9280: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
9290: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
92e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  ..static int.Imp
92f0: 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  ortObjCmd(.    T
9300: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
9310: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
9320: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p *interp,.    i
9330: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c  nt objc,.    Tcl
9340: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9350: 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []).{.    Tcl_Ch
9360: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
9370: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
9380: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
9390: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
93a0: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
93b0: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
93c0: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
93d0: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c  _CTX *ctx..= NUL
93e0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
93f0: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a  script..= NULL;.
9400: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
9410: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  sword..= NULL;. 
9420: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64     Tcl_Obj *vcmd
9430: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9440: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43  l_DString upperC
9450: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
9460: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  n, upperChannelB
9470: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68  locking, upperCh
9480: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75  annelEncoding, u
9490: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
94a0: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b  ar;.    int idx;
94b0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
94c0: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
94d0: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  ...= TLS_TCL_INI
94e0: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
94f0: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63  r...= 0;./* is c
9500: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69  onnection incomi
9510: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20  ng or outgoing? 
9520: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  */.    char *key
9530: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
9540: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
9550: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  ..= NULL;.    un
9560: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
9570: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9580: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09  l_Size key_len..
9590: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
95a0: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20  d char *cert..= 
95b0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
95c0: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30  ze cert_len..= 0
95d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
95e0: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ers..= NULL;.   
95f0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
9600: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tes..= NULL;.   
9610: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d   char *CAfile..=
9620: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9630: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b  *CApath..= NULL;
9640: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
9650: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ams..= NULL;.   
9660: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d   char *model...=
9670: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9680: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e  *servername..= N
9690: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
96a0: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
96b0: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20   Indication */. 
96c0: 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e     char *session
96d0: 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  _id..= NULL;.   
96e0: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09   Tcl_Obj *alpn..
96f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
9700: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
9710: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
9720: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
9730: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
9740: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
9750: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
9760: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
9770: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
9780: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
9790: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
97a0: 73 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20  shake = 0;..    
97b0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
97c0: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
97d0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
97e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
97f0: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20  LS1).    tls1 = 
9800: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
9810: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
9820: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
9830: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
9840: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23     tls1_1 = 0;.#
9850: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
9860: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
9870: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9880: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74  NO_TLS1_2).    t
9890: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_2 = 0;.#endi
98a0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
98b0: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
98c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
98d0: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_3).    tls1_
98e0: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  3 = 0;.#endif.. 
98f0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
9900: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
9910: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
9920: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f  objv, "channel ?
9930: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74  options?");..ret
9940: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9950: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
9960: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
9970: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9980: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
9990: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
99a0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
99b0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
99c0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
99d0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
99e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
99f0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
9a00: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
9a10: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
9a20: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
9a30: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
9a40: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f  l(chan);..    fo
9a50: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20  r (idx = 2; idx 
9a60: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b  < objc; idx++) {
9a70: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63  ..char *opt = Tc
9a80: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
9a90: 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70  [idx]);...if (op
9aa0: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20  t[0] != '-')..  
9ab0: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42    break;...OPTOB
9ac0: 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29  J("-alpn", alpn)
9ad0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69  ;..OPTSTR("-cadi
9ae0: 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 4f 50  r", CApath);..OP
9af0: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20  TSTR("-cafile", 
9b00: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54  CAfile);..OPTBYT
9b10: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c  E("-cert", cert,
9b20: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54   cert_len);..OPT
9b30: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c  STR("-certfile",
9b40: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54   certfile);..OPT
9b50: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63  STR("-cipher", c
9b60: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9b70: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70  ("-ciphers", cip
9b80: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  hers);..OPTSTR("
9b90: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20  -ciphersuites", 
9ba0: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09  ciphersuites);..
9bb0: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64  OPTOBJ("-command
9bc0: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54  ", script);..OPT
9bd0: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c  STR("-dhparams",
9be0: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54   DHparams);..OPT
9bf0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79  BYTE("-key", key
9c00: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54  , key_len);..OPT
9c10: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20  STR("-keyfile", 
9c20: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  keyfile);..OPTST
9c30: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65  R("-model", mode
9c40: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61  l);..OPTOBJ("-pa
9c50: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72  ssword", passwor
9c60: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70  d);..OPTBOOL("-p
9c70: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20  ost_handshake", 
9c80: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b  post_handshake);
9c90: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75  ..OPTBOOL("-requ
9ca0: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a  est", request);.
9cb0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69  .OPTBOOL("-requi
9cc0: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09  re", require);..
9cd0: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74  OPTINT("-securit
9ce0: 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29  y_level", level)
9cf0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72  ;..OPTBOOL("-ser
9d00: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09  ver", server);..
9d10: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e  OPTSTR("-servern
9d20: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65  ame", servername
9d30: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73  );..OPTSTR("-ses
9d40: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f  sion_id", sessio
9d50: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  n_id);..OPTBOOL(
9d60: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a  "-ssl2", ssl2);.
9d70: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22  .OPTBOOL("-ssl3"
9d80: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f  , ssl3);..OPTBOO
9d90: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29  L("-tls1", tls1)
9da0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9db0: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09  1.1", tls1_1);..
9dc0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32  OPTBOOL("-tls1.2
9dd0: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54  ", tls1_2);..OPT
9de0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20  BOOL("-tls1.3", 
9df0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a  tls1_3);..OPTOBJ
9e00: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61  ("-validatecomma
9e10: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54  nd", vcmd);..OPT
9e20: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d  OBJ("-vcmd", vcm
9e30: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70  d);...OPTBAD("op
9e40: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d  tion", "-alpn, -
9e50: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20  cadir, -cafile, 
9e60: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65  -cert, -certfile
9e70: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68  , -cipher, -ciph
9e80: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61  ersuites, -comma
9e90: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d  nd, -dhparams, -
9ea0: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d  key, -keyfile, -
9eb0: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64  model, -password
9ec0: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  , -post_handshak
9ed0: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65  e, -request, -re
9ee0: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79  quire, -security
9ef0: 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c  _level, -server,
9f00: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73   -servername, -s
9f10: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32  ession_id, -ssl2
9f20: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20  , -ssl3, -tls1, 
9f30: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32  -tls1.1, -tls1.2
9f40: 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76  , -tls1.3, or -v
9f50: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29  alidatecommand")
9f60: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
9f70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
9f80: 69 66 20 28 72 65 71 75 65 73 74 29 09 20 20 20  if (request).   
9f90: 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56   verify |= SSL_V
9fa0: 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
9fb0: 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  E | SSL_VERIFY_P
9fc0: 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71  EER;.    if (req
9fd0: 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29  uest && require)
9fe0: 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56   verify |= SSL_V
9ff0: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
a000: 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20  _PEER_CERT;.    
a010: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
a020: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76  ost_handshake).v
a030: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
a040: 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41  IFY_POST_HANDSHA
a050: 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69  KE;.    if (veri
a060: 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79 20  fy == 0).verify 
a070: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
a080: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
a090: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
a0a0: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
a0b0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
a0c0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
a0d0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
a0e0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
a0f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
a100: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
a110: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
a120: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
a130: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a140: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
a150: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20  _TLS1_2 : 0);.  
a160: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a170: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _3 ? TLS_PROTO_T
a180: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20  LS1_3 : 0);..   
a190: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   /* reset to NUL
a1a0: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e  L if blank strin
a1b0: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20  g provided */.  
a1c0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a    if (cert && !*
a1d0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63  cert)..        c
a1e0: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ert.        = NU
a1f0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  LL;.    if (key 
a200: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20  && !*key)..     
a210: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d     key.        =
a220: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a230: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72  ertfile && !*cer
a240: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63  tfile)         c
a250: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  ertfile.= NULL;.
a260: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
a270: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b  && !*keyfile)..k
a280: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
a290: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a2a0: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68  iphers && !*ciph
a2b0: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70  ers).        cip
a2c0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
a2d0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
a2e0: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63  hersuites && !*c
a2f0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70  iphersuites) cip
a300: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e  hersuites    = N
a310: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66  ULL;.    if (CAf
a320: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29  ile && !*CAfile)
a330: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09  .        CAfile.
a340: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a350: 20 20 20 20 69 66 20 28 43 41 70 61 74 68 20 26      if (CApath &
a360: 26 20 21 2a 43 41 70 61 74 68 29 09 20 20 20 20  & !*CApath).    
a370: 20 20 20 20 43 41 70 61 74 68 09 20 20 20 20 20      CApath.     
a380: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a390: 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21  f (DHparams && !
a3a0: 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20  *DHparams).     
a3b0: 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20     DHparams     
a3c0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20     = NULL;..    
a3d0: 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65  /* new SSL state
a3e0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
a3f0: 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b  ..= (State *) ck
a400: 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29  alloc((unsigned)
a410: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b   sizeof(State));
a420: 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74  .    memset(stat
a430: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ePtr, 0, sizeof(
a440: 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74  State));..    st
a450: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20  atePtr->flags.= 
a460: 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65  flags;.    state
a470: 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e  Ptr->interp.= in
a480: 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50  terp;.    stateP
a490: 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72  tr->vflags.= ver
a4a0: 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ify;.    statePt
a4b0: 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20  r->err.= "";..  
a4c0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63    /* allocate sc
a4d0: 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ript */.    if (
a4e0: 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64  script) {..(void
a4f0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a500: 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26  romObj(script, &
a510: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
a520: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
a530: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69  >callback = scri
a540: 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  pt;..    Tcl_Inc
a550: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a560: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09  tr->callback);..
a570: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a580: 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72  allocate passwor
a590: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73  d */.    if (pas
a5a0: 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29  sword) {..(void)
a5b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a5c0: 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20  omObj(password, 
a5d0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a5e0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a5f0: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73  ->password = pas
a600: 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f  sword;..    Tcl_
a610: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a620: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
a630: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a640: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69  /* allocate vali
a650: 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  date command */.
a660: 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a      if (vcmd) {.
a670: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
a680: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d  tringFromObj(vcm
a690: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c  d, &len);..if (l
a6a0: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65  en) {..    state
a6b0: 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64  Ptr->vcmd = vcmd
a6c0: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
a6d0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
a6e0: 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20  ->vcmd);..}.    
a6f0: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c  }..    if (model
a700: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74   != NULL) {..int
a710: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74   mode;../* Get t
a720: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65  he "model" conte
a730: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  xt */..chan = Tc
a740: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
a750: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64  erp, model, &mod
a760: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d  e);..if (chan ==
a770: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
a780: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
a790: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
a7a0: 79 70 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b  ype *)statePtr);
a7b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a7c0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a  _ERROR;..}.../*.
a7d0: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f  . * Make sure to
a7e0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
a7f0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
a800: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  . */..chan = Tcl
a810: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
a820: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47  han);..if (Tcl_G
a830: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
a840: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
a850: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20  elType()) {..   
a860: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a870: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
a880: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
a890: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
a8a0: 68 61 6e 29 2c 0a 09 09 20 20 20 20 22 5c 22 3a  han),...    "\":
a8b0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
a8c0: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  el", (char *)NUL
a8d0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
a8e0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
a8f0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
a900: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
a910: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
a920: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73  )NULL);..    Tls
a930: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
a940: 74 79 70 65 20 2a 29 73 74 61 74 65 50 74 72 29  type *)statePtr)
a950: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a960: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78  L_ERROR;..}..ctx
a970: 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c   = ((State *)Tcl
a980: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
a990: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e  nceData(chan))->
a9a0: 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ctx;.    } else 
a9b0: 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54  {..if ((ctx = CT
a9c0: 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c  X_Init(statePtr,
a9d0: 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20   server, proto, 
a9e0: 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c  keyfile, certfil
a9f0: 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 28 69  e, key, cert, (i
aa00: 6e 74 29 6b 65 79 5f 6c 65 6e 2c 0a 09 09 28 69  nt)key_len,...(i
aa10: 6e 74 29 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70  nt)cert_len, CAp
aa20: 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70  ath, CAfile, cip
aa30: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74  hers, ciphersuit
aa40: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72  es, level, DHpar
aa50: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ams)) == NULL) {
aa60: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
aa70: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
aa80: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
aa90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
aaa0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
aab0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
aac0: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ctx;..    /*.   
aad0: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d    * We need to m
aae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
aaf0: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20  e channel works 
ab00: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74  in binary (for t
ab10: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70  he.     * encryp
ab20: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20  tion not to get 
ab30: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20  goofed up)..    
ab40: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20   * We only want 
ab50: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75  to adjust the bu
ab60: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76  ffering in pre-v
ab70: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72  2 channels, wher
ab80: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68  e.     * each ch
ab90: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61  annel in the sta
aba0: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74  ck maintained it
abb0: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20  s own buffers.. 
abc0: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44      */.    Tcl_D
abd0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
abe0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
abf0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
ac00: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
ac10: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
ac20: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
ac30: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
ac40: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
ac50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
ac60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
ac70: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
ac80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ac90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
aca0: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70  "-eofchar", &upp
acb0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
acc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
acd0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ace0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f  rp, chan, "-enco
acf0: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  ding", &upperCha
ad00: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ad10: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ad20: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ad30: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ad40: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ion", &upperChan
ad50: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
ad60: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
ad70: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ad80: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
ad90: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
ada0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
adb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
adc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
add0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
ade0: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20  n", "binary");. 
adf0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ae00: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ae10: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
ae20: 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20  ", "true");.    
ae30: 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69  dprintf("Consumi
ae40: 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25  ng Tcl channel %
ae50: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
ae60: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20  elName(chan));. 
ae70: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c     statePtr->sel
ae80: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61  f = Tcl_StackCha
ae90: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73  nnel(interp, Tls
aea0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20  _ChannelType(), 
aeb0: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52  statePtr, (TCL_R
aec0: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
aed0: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
aee0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
aef0: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
af00: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
af10: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
af20: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
af30: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
af40: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
af50: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
af60: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
af70: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
af80: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
af90: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
afa0: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
afb0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
afc0: 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  e *)statePtr);..
afd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
afe0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
aff0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
b000: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
b010: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e  tr->self, "-tran
b020: 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53  slation", Tcl_DS
b030: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
b040: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
b050: 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ion));.    Tcl_S
b060: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
b070: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
b080: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69  ->self, "-encodi
b090: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
b0a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
b0b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20  nelEncoding));. 
b0c0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
b0d0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
b0e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
b0f0: 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f  "-eofchar", Tcl_
b100: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b110: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
b120: 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  r));.    Tcl_Set
b130: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
b140: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
b150: 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  self, "-blocking
b160: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
b170: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
b180: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20  lBlocking));.   
b190: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
b1a0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
b1b0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
b1c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b1d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
b1e0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
b1f0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b200: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
b210: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b220: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b230: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a  nnelBlocking);..
b240: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53      /*.     * SS
b250: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  L Initialization
b260: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  .     */.    sta
b270: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c  tePtr->ssl = SSL
b280: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63  _new(statePtr->c
b290: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74  tx);.    if (!st
b2a0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
b2b0: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65  /* SSL library e
b2c0: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70  rror */..Tcl_App
b2d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b2e0: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73  , "couldn't cons
b2f0: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f  truct ssl sessio
b300: 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  n: ", GET_ERR_RE
b310: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b320: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
b330: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b340: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b350: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45  , "INIT", "FAILE
b360: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
b370: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c  );..Tls_Free((tl
b380: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 73 74  s_free_type *)st
b390: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
b3a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b3b0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f  }..    /* Set ho
b3c0: 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a  st server name *
b3d0: 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  /.    if (server
b3e0: 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73  name) {../* Sets
b3f0: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65   the server name
b400: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49   indication (SNI
b410: 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  ) in ClientHello
b420: 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f   extension */../
b430: 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20  * Per RFC 6066, 
b440: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53  hostname is a AS
b450: 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69  CII encoded stri
b460: 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34  ng, though RFC 4
b470: 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20  366 says UTF-8. 
b480: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74  */..if (!SSL_set
b490: 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d  _tlsext_host_nam
b4a0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  e(statePtr->ssl,
b4b0: 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20   servername) && 
b4c0: 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20  require) {..    
b4d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b4e0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e  (interp, "Set SN
b4f0: 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c  I extension fail
b500: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
b510: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
b520: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c  )NULL);..    Tcl
b530: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b540: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b550: 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46  PORT", "SNI", "F
b560: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b570: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b580: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b590: 79 70 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b  ype *)statePtr);
b5a0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b5b0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
b5c0: 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72  Set hostname for
b5d0: 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74   peer certificat
b5e0: 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66  e hostname verif
b5f0: 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e  ication in clien
b600: 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73  ts...   Don't us
b610: 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20  e SSL_set1_host 
b620: 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d  since it has lim
b630: 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66  itations. */..if
b640: 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74   (!SSL_add1_host
b650: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
b660: 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09  servername)) {..
b670: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b680: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
b690: 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66  t DNS hostname f
b6a0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b6b0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b6c0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
b6d0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b6e0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b6f0: 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e  "IMPORT", "HOSTN
b700: 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  AME", "FAILED", 
b710: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
b720: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
b730: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 73 74  s_free_type *)st
b740: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b750: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b760: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
b770: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20   Resume session 
b780: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  id */.    if (se
b790: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c  ssion_id && strl
b7a0: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c  en(session_id) <
b7b0: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54  = SSL_MAX_SID_CT
b7c0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20  X_LENGTH) {../* 
b7d0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_set_session(
b7e0: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53  ) */..if (!SSL_S
b7f0: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63  ESSION_set1_id_c
b800: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73  ontext(SSL_get_s
b810: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d  ession(statePtr-
b820: 3e 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20  >ssl),...(const 
b830: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
b840: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e   session_id, (un
b850: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c  signed int) strl
b860: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29  en(session_id)))
b870: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
b880: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b890: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e   "Resume session
b8a0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
b8b0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b8c0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
b8d0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b8e0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b8f0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53  , "IMPORT", "SES
b900: 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c  SION", "FAILED",
b910: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
b920: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
b930: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 73  ls_free_type *)s
b940: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b950: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b960: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
b970: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61  * Enable Applica
b980: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f  tion-Layer Proto
b990: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
b9a0: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68   Examples are: h
b9b0: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31  ttp/1.0,..http/1
b9c0: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c  .1, h2, h3, ftp,
b9d0: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70   imap, pop3, xmp
b9e0: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73  p-client, xmpp-s
b9f0: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63  erver, mqtt, irc
ba00: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66  , etc. */.    if
ba10: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f   (alpn) {../* Co
ba20: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74  nvert a TCL list
ba30: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c   into a protocol
ba40: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f  -list in wire-fo
ba50: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65  rmat */..unsigne
ba60: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20  d char *protos, 
ba70: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  *p;..unsigned in
ba80: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30  t protos_len = 0
ba90: 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c  ;..Tcl_Size cnt,
baa0: 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c   i;..int j;..Tcl
bab0: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69  _Obj **list;...i
bac0: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
bad0: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
bae0: 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c  , alpn, &cnt, &l
baf0: 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ist) != TCL_OK) 
bb00: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
bb10: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
bb20: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
bb30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bb40: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
bb50: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
bb60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
bb70: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
bb80: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
bb90: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
bba0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
bbb0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
bbc0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
bbd0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
bbe0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
bbf0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
bc00: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74  protocol names t
bc10: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20  oo long", (char 
bc20: 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53  *)NULL);...Tcl_S
bc30: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
bc40: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
bc50: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
bc60: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e  ILED", (char *)N
bc70: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65  ULL);...Tls_Free
bc80: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
bc90: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72  *)statePtr);...r
bca0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bcb0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f  ..    }..    pro
bcc0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28  tos_len += 1 + (
bcd0: 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  int) len;..}.../
bce0: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70  * Build the comp
bcf0: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  lete protocol-li
bd00: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20  st */..protos = 
bd10: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c  ckalloc(protos_l
bd20: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f  en);../* protoco
bd30: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20  l-lists consist 
bd40: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d  of 8-bit length-
bd50: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73  prefixed, byte s
bd60: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28  trings */..for (
bd70: 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f  j = 0, p = proto
bd80: 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29  s; j < cnt; j++)
bd90: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74   {..    char *st
bda0: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
bdb0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d  gFromObj(list[j]
bdc0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70  , &len);..    *p
bdd0: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ++ = (unsigned c
bde0: 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d  har) len;..    m
bdf0: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73  emcpy(p, str, (s
be00: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20  ize_t) len);..  
be10: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a    p += len;..}..
be20: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  ./* SSL_set_alpn
be30: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20  _protos makes a 
be40: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74  copy of the prot
be50: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a  ocol-list */../*
be60: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63   Note: This func
be70: 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68  tion reverses th
be80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
be90: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
bea0: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
beb0: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
bec0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
bed0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
bee0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
bef0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41  t(interp, "Set A
bf00: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61  LPN protocols fa
bf10: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
bf20: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
bf30: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54   *)NULL);..    T
bf40: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bf50: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bf60: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
bf70: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
bf80: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54   *)NULL);..    T
bf90: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
bfa0: 65 5f 74 79 70 65 20 2a 29 73 74 61 74 65 50 74  e_type *)statePt
bfb0: 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28  r);..    ckfree(
bfc0: 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65  protos);..    re
bfd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bfe0: 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72  .}.../* Store pr
bff0: 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a  otocols list */.
c000: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
c010: 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61  s = protos;..sta
c020: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
c030: 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a  n = protos_len;.
c040: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74      } else {..st
c050: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
c060: 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72   NULL;..statePtr
c070: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30  ->protos_len = 0
c080: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
c090: 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62       * SSL Callb
c0a0: 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20  acks.     */.   
c0b0: 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74   SSL_set_app_dat
c0c0: 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  a(statePtr->ssl,
c0d0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c0e0: 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63  r);./* point bac
c0f0: 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53  k to us */.    S
c100: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74  SL_set_verify(st
c110: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72  atePtr->ssl, ver
c120: 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62  ify, VerifyCallb
c130: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65  ack);.    SSL_se
c140: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28  t_info_callback(
c150: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49  statePtr->ssl, I
c160: 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20  nfoCallback);.. 
c170: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
c180: 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f  or observing pro
c190: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a  tocol messages *
c1a0: 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53  /.#ifndef OPENSS
c1b0: 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20  L_NO_SSL_TRACE. 
c1c0: 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43     /* void SSL_C
c1d0: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  TX_set_msg_callb
c1e0: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72  ack_arg(statePtr
c1f0: 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73  ->ctx, (void *)s
c200: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f  tatePtr);.    vo
c210: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  id SSL_CTX_set_m
c220: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  sg_callback(stat
c230: 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61  ePtr->ctx, Messa
c240: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a  geCallback); */.
c250: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
c260: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
c270: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69  tePtr->ssl, (voi
c280: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
c290: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63     SSL_set_msg_c
c2a0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72  allback(statePtr
c2b0: 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61  ->ssl, MessageCa
c2c0: 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  llback);.#endif.
c2d0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54  .    /* Create T
c2e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48  cl_Channel BIO H
c2f0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74  andler */.    st
c300: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20  atePtr->p_bio.= 
c310: 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74  BIO_new_tcl(stat
c320: 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53  ePtr, BIO_NOCLOS
c330: 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  E);.    statePtr
c340: 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28  ->bio.= BIO_new(
c350: 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20  BIO_f_ssl());.. 
c360: 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b     if (server) {
c370: 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c  ../* Server call
c380: 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54  backs */..SSL_CT
c390: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72  X_set_tlsext_ser
c3a0: 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74  vername_arg(stat
c3b0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64  ePtr->ctx, (void
c3c0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53   *)statePtr);..S
c3d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
c3e0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c  t_servername_cal
c3f0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c400: 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b  ctx, SNICallback
c410: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c420: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28  client_hello_cb(
c430: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48  statePtr->ctx, H
c440: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  elloCallback, (v
c450: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c460: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
c470: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
c480: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  {..    SSL_CTX_s
c490: 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63  et_alpn_select_c
c4a0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c4b0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28   ALPNCallback, (
c4c0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c4d0: 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  ;.#ifdef USE_NPN
c4e0: 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32  ..    if (tls1_2
c4f0: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
c500: 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54  == 0) {...SSL_CT
c510: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  X_set_next_proto
c520: 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28  s_advertised_cb(
c530: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e  statePtr->ctx, N
c540: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  PNCallback, (voi
c550: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c560: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a      }.#endif..}.
c570: 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76  ../* Enable serv
c580: 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20  er to send cert 
c590: 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61  request after ha
c5a0: 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33  ndshake (TLS 1.3
c5b0: 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20   only) */../* A 
c5c0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
c5d0: 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20  must take place 
c5e0: 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63  for the Certific
c5f0: 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62  ate Request to b
c600: 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68  e..   sent to th
c610: 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63  e client, this c
c620: 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20  an be done with 
c630: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65  SSL_do_handshake
c640: 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75  (). */..if (requ
c650: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64  est && post_hand
c660: 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29  shake && tls1_3)
c670: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69   {..    SSL_veri
c680: 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68  fy_client_post_h
c690: 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74  andshake(statePt
c6a0: 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a  r->ssl);..}.../*
c6b0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63   set automatic c
c6c0: 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a  urve selection *
c6d0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f  /..SSL_set_ecdh_
c6e0: 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73  auto(statePtr->s
c6f0: 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74  sl, 1);.../* Set
c700: 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a   server mode */.
c710: 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73  .statePtr->flags
c720: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56   |= TLS_TCL_SERV
c730: 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63  ER;..SSL_set_acc
c740: 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50  ept_state(stateP
c750: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20  tr->ssl);.    } 
c760: 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e  else {../* Clien
c770: 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23  t callbacks */.#
c780: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69  ifdef USE_NPN..i
c790: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
c7a0: 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74  tos != NULL && t
c7b0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c7c0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20  s1_3 == 0) {..  
c7d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65    SSL_CTX_set_ne
c7e0: 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f  xt_proto_select_
c7f0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c800: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
c810: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c820: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f  );..}.#endif.../
c830: 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e  * Session cachin
c840: 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  g */..SSL_CTX_se
c850: 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f  t_session_cache_
c860: 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63  mode(statePtr->c
c870: 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  tx, SSL_SESS_CAC
c880: 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f  HE_CLIENT | SSL_
c890: 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e  SESS_CACHE_NO_IN
c8a0: 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09  TERNAL_STORE);..
c8b0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
c8c0: 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72  _new_cb(statePtr
c8d0: 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61  ->ctx, SessionCa
c8e0: 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e  llback);.../* En
c8f0: 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68  able post handsh
c900: 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69  ake Authenticati
c910: 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c  on extension. TL
c920: 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20  S 1.3 only, not 
c930: 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28  http/2. */..if (
c940: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f  request && post_
c950: 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20  handshake) {..  
c960: 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68    SSL_set_post_h
c970: 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74  andshake_auth(st
c980: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
c990: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69  ..}.../* Set cli
c9a0: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c  ent mode */..SSL
c9b0: 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61  _set_connect_sta
c9c0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c9d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c  );.    }.    SSL
c9e0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74  _set_bio(statePt
c9f0: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72  r->ssl, statePtr
ca00: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74  ->p_bio, statePt
ca10: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42  r->p_bio);.    B
ca20: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65  IO_set_ssl(state
ca30: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50  Ptr->bio, stateP
ca40: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43  tr->ssl, BIO_NOC
ca50: 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  LOSE);..    /*. 
ca60: 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c      * End of SSL
ca70: 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20   Init.     */.  
ca80: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
ca90: 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65  ning %s", Tcl_Ge
caa0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
cab0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
cac0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
cad0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
cae0: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  )Tcl_GetChannelN
caf0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
cb00: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  lf), TCL_VOLATIL
cb10: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
cb20: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f  ---. *. * Unimpo
cb80: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  rtObjCmd --. *. 
cb90: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
cba0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
cbb0: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73  emove the topmos
cbc0: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72  t channel filter
cbd0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
cbe0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
cbf0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
cc00: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
cc10: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
cc20: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
cc30: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
cc40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
cc90: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a   int.UnimportObj
cca0: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
ccb0: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
ccc0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ccd0: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp,.    int obj
cce0: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c,.    Tcl_Obj *
ccf0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a  const objv[]).{.
cd00: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
cd10: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
cd20: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
cd30: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20  ode on. */..    
cd40: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
cd50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
cd60: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
cd70: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
cd80: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
cd90: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
cda0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cdb0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
cdc0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
cdd0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
cde0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
cdf0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
ce00: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
ce10: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
ce20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ce30: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
ce40: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
ce50: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
ce60: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
ce70: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
ce80: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
ce90: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
cea0: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
ceb0: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
cec0: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
ced0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cee0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
cef0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
cf00: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
cf10: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
cf20: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
cf30: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
cf40: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
cf50: 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52   "TLS", "UNIMPOR
cf60: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  T", "CHANNEL", "
cf70: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
cf80: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
cf90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cfa0: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  }..    if (Tcl_U
cfb0: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
cfc0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
cfd0: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74  CL_ERROR) {..ret
cfe0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cff0: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
d000: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
d010: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d050: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f  -----. *. * CTX_
d060: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63  Init -- construc
d070: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  t a SSL_CTX inst
d080: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ance. *. * Resul
d090: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53  ts:. *.A valid S
d0a0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20  SL_CTX instance 
d0b0: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53  or NULL.. *. * S
d0c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
d0d0: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63  constructs SSL c
d0e0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
d0f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
d140: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f  c SSL_CTX *.CTX_
d150: 49 6e 69 74 28 0a 20 20 20 20 53 74 61 74 65 20  Init(.    State 
d160: 2a 73 74 61 74 65 50 74 72 2c 0a 20 20 20 20 69  *statePtr,.    i
d170: 6e 74 20 69 73 53 65 72 76 65 72 2c 0a 20 20 20  nt isServer,.   
d180: 20 69 6e 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20   int proto,.    
d190: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20  char *keyfile,. 
d1a0: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c     char *certfil
d1b0: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
d1c0: 63 68 61 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75  char *key,.    u
d1d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
d1e0: 72 74 2c 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f  rt,.    int key_
d1f0: 6c 65 6e 2c 0a 20 20 20 20 69 6e 74 20 63 65 72  len,.    int cer
d200: 74 5f 6c 65 6e 2c 0a 20 20 20 20 63 68 61 72 20  t_len,.    char 
d210: 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61  *CApath,.    cha
d220: 72 20 2a 43 41 66 69 6c 65 2c 0a 20 20 20 20 63  r *CAfile,.    c
d230: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 0a 20 20  har *ciphers,.  
d240: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75    char *ciphersu
d250: 69 74 65 73 2c 0a 20 20 20 20 69 6e 74 20 6c 65  ites,.    int le
d260: 76 65 6c 2c 0a 20 20 20 20 63 68 61 72 20 2a 44  vel,.    char *D
d270: 48 70 61 72 61 6d 73 29 0a 7b 0a 20 20 20 20 54  Hparams).{.    T
d280: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d290: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
d2a0: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
d2b0: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
d2c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
d2d0: 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d  s;.    int off =
d2e0: 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20   0, abort = 0;. 
d2f0: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
d300: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
d310: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
d320: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
d330: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
d340: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
d350: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d360: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
d370: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
d380: 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20  elected", (char 
d390: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
d3a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
d3b0: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20    /* create SSL 
d3c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f  context */.#if O
d3d0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
d3e0: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
d3f0: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
d400: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
d410: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d420: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL2).    if (ENA
d430: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d440: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09  PROTO_SSL2)) {..
d450: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d460: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70  (interp, "SSL2 p
d470: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d480: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d490: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d4a0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d4b0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d4c0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
d4d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
d4e0: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
d4f0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d500: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63  OTO_SSL3)) {..Tc
d510: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d520: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f  nterp, "SSL3 pro
d530: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d540: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ted", (char *)NU
d550: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d560: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d570: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d580: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
d590: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d5a0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d5b0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d5c0: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f  O_TLS1)) {..Tcl_
d5d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d5e0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72  erp, "TLS 1.0 pr
d5f0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d600: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e  rted", (char *)N
d610: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d620: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
d630: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
d640: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
d650: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d660: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_1).    if (EN
d670: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d680: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20  _PROTO_TLS1_1)) 
d690: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d6a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
d6b0: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.1 protocol no
d6c0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d6d0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
d6e0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d6f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d700: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
d710: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d720: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
d730: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d740: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
d750: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_2)) {..Tcl_Ap
d760: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d770: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74  p, "TLS 1.2 prot
d780: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d790: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ed", (char *)NUL
d7a0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d7b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d7c0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
d7d0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
d7e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d7f0: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _3).    if (ENAB
d800: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d810: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a  ROTO_TLS1_3)) {.
d820: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d830: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
d840: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .3 protocol not 
d850: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
d860: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
d870: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d880: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72  endif.    if (pr
d890: 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20  oto == 0) {../* 
d8a0: 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a  Use full range *
d8b0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  /..SSL_CTX_set_m
d8c0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
d8d0: 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43  (ctx, 0);..SSL_C
d8e0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
d8f0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29  _version(ctx, 0)
d900: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
d910: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69  tch (proto) {.#i
d920: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
d930: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
d940: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
d950: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
d960: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d970: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
d980: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
d990: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d9a0: 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72  rver ? SSLv2_ser
d9b0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
d9c0: 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv2_client_meth
d9d0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d9e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d9f0: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
da00: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
da10: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
da20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
da30: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
da40: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
da50: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  SL3:..method = i
da60: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f  sServer ? SSLv3_
da70: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
da80: 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d  : SSLv3_client_m
da90: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
daa0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dab0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
dac0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dad0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  L_NO_TLS1) && !d
dae0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
daf0: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20  O_TLS1_METHOD). 
db00: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
db10: 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20  O_TLS1:..method 
db20: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
db30: 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v1_server_method
db40: 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e  () : TLSv1_clien
db50: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
db60: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
db70: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
db80: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
db90: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
dba0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dbb0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
dbc0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
dbd0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
dbe0: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  1:..method = isS
dbf0: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f  erver ? TLSv1_1_
dc00: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
dc10: 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74  : TLSv1_1_client
dc20: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
dc30: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
dc40: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
dc50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dc60: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
dc70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
dc80: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
dc90: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
dca0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
dcb0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
dcc0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73  rver ? TLSv1_2_s
dcd0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
dce0: 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f   TLSv1_2_client_
dcf0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
dd00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
dd10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
dd20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
dd30: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
dd40: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
dd50: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55  TO_TLS1_3:../* U
dd60: 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d  se the generic m
dd70: 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72  ethod and constr
dd80: 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72  aint range after
dd90: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61   context is crea
dda0: 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d  ted */..method =
ddb0: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f   isServer ? TLS_
ddc0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
ddd0: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74  : TLS_client_met
dde0: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
ddf0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
de00: 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65  t:../* Negotiate
de10: 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62   highest availab
de20: 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69  le SSL/TLS versi
de30: 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  on */..method = 
de40: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
de50: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
de60: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
de70: 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  od();.#if OPENSS
de80: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
de90: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
dea0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
deb0: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
dec0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
ded0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dee0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
def0: 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a  TO_SSL2)   ? 0 :
df00: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32   SSL_OP_NO_SSLv2
df10: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
df20: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
df30: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
df40: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66  SSL_NO_SSL3)..of
df50: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
df60: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
df70: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  SL3)   ? 0 : SSL
df80: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23  _OP_NO_SSLv3);.#
df90: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
dfa0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
dfb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
dfc0: 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d  NO_TLS1)..off |=
dfd0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
dfe0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
dff0: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
e000: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69  NO_TLSv1);.#endi
e010: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e020: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
e030: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e040: 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d  _TLS1_1)..off |=
e050: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
e060: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
e070: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  1) ? 0 : SSL_OP_
e080: 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e  NO_TLSv1_1);.#en
e090: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e0a0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
e0b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e0c0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20  NO_TLS1_2)..off 
e0d0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
e0e0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
e0f0: 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_2) ? 0 : SSL_O
e100: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23  P_NO_TLSv1_2);.#
e110: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
e120: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
e130: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e140: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66  L_NO_TLS1_3)..of
e150: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
e160: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
e170: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_3) ? 0 : SSL
e180: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b  _OP_NO_TLSv1_3);
e190: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a  .#endif..break;.
e1a0: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
e1b0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
e1c0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
e1d0: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
e1e0: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72    if (!ctx) {..r
e1f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
e200: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e  }..    if (geten
e210: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
e220: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
e230: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b  _keylog_callback
e240: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c  (ctx, KeyLogCall
e250: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  back);.    }..#i
e260: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
e270: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
e280: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e290: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f  1_3).    if (pro
e2a0: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f  to == TLS_PROTO_
e2b0: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43  TLS1_3) {..SSL_C
e2c0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
e2d0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
e2e0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
e2f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
e300: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
e310: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
e320: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  N);.    }.#endif
e330: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63  ..    /* Force c
e340: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20  ipher selection 
e350: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20  order by server 
e360: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65  */.    if (!isSe
e370: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58  rver) {..SSL_CTX
e380: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
e390: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f  , SSL_OP_CIPHER_
e3a0: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43  SERVER_PREFERENC
e3b0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f  E);.    }..#if O
e3c0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
e3d0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
e3e0: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f  00L.    OpenSSL_
e3f0: 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68  add_all_algorith
e400: 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69  ms(); /* Load ci
e410: 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74  phers and digest
e420: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20  s */.#endif..   
e430: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70   SSL_CTX_set_app
e440: 5f 64 61 74 61 28 63 74 78 2c 20 69 6e 74 65 72  _data(ctx, inter
e450: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
e460: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
e470: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
e480: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
e490: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
e4a0: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
e4b0: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
e4c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
e4d0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e  ns(ctx, SSL_OP_N
e4e0: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09  O_COMPRESSION);.
e4f0: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72  /* disable compr
e500: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73  ession even if s
e510: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20  upported */.    
e520: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
e530: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09  ons(ctx, off);..
e540: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f  /* disable proto
e550: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a  col versions */.
e560: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
e570: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
e580: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c  0101000L.    SSL
e590: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74  _CTX_set_mode(ct
e5a0: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  x, SSL_MODE_AUTO
e5b0: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64  _RETRY);./* hand
e5c0: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65  le new handshake
e5d0: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e  s in background.
e5e0: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69   On by default i
e5f0: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e  n OpenSSL 1.1.1.
e600: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53   */.#endif.    S
e610: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
e620: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20  cache_size(ctx, 
e630: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  128);..    /* Se
e640: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  t user defined c
e650: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73  iphers, cipher s
e660: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72  uites, and secur
e670: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
e680: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
e690: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
e6a0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69  TX_set_cipher_li
e6b0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29  st(ctx, ciphers)
e6c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
e6d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
e6e0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65  et ciphers faile
e6f0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
e700: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ers", (char *)NU
e710: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
e720: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
e730: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
e740: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74   if ((ciphersuit
e750: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  es != NULL) && !
e760: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
e770: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69  ersuites(ctx, ci
e780: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09  phersuites)) {..
e790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e7a0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
e7b0: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c  pher suites fail
e7c0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
e7d0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 4e  hers", (char *)N
e7e0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
e7f0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
e800: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
e810: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69     /* Set securi
e820: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
e830: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26  if (level > -1 &
e840: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09  & level < 6) {..
e850: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72  /* SSL_set_secur
e860: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53  ity_level */..SS
e870: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69  L_CTX_set_securi
e880: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65  ty_level(ctx, le
e890: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  vel);.    }..   
e8a0: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
e8b0: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
e8c0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e8d0: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
e8e0: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
e8f0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
e900: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
e910: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
e920: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
e930: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72  ePtr);..    /* r
e940: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c  ead a Diffie-Hel
e950: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lman parameters 
e960: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65  file, or use the
e970: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f   built-in one */
e980: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
e990: 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65  Init(&ds);.#ifde
e9a0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a  f OPENSSL_NO_DH.
e9b0: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
e9c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
e9d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e9e0: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65  terp, "DH parame
e9f0: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20  ter support not 
ea00: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61  available", (cha
ea10: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  r *)NULL);..SSL_
ea20: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
ea30: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
ea40: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09   }.#else.    {..
ea50: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70  DH* dh;..if (DHp
ea60: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
ea70: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ..    BIO *bio;.
ea80: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f  ..    bio = BIO_
ea90: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70  new_file(F2N(DHp
eaa0: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22  arams, &ds), "r"
eab0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f  );..    if (!bio
eac0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
ead0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63  gFree(&ds);...Tc
eae0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
eaf0: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
eb00: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65  t find DH parame
eb10: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61  ters file", (cha
eb20: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c  r *)NULL);...SSL
eb30: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
eb40: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
eb50: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d      }...    dh =
eb60: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48   PEM_read_bio_DH
eb70: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c  params(bio, NULL
eb80: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
eb90: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f      BIO_free(bio
eba0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
ebb0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
ebc0: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09     if (!dh) {...
ebd0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ebe0: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
ebf0: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61  not read DH para
ec00: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65  meters from file
ec10: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
ec20: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
ec30: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
ec40: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20  NULL;..    }..  
ec50: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d    SSL_CTX_set_tm
ec60: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09  p_dh(ctx, dh);..
ec70: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b      DH_free(dh);
ec80: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
ec90: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77  /* Use well know
eca0: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  n DH parameters 
ecb0: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d  that have built-
ecc0: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70  in support in Op
ecd0: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66  enSSL */..    if
ece0: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64   (!SSL_CTX_set_d
ecf0: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20  h_auto(ctx, 1)) 
ed00: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
ed10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
ed20: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73  uld not enable s
ed30: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47  et DH auto: ", G
ed40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
ed50: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
ed60: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
ed70: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
ed80: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  LL;..    }..}.  
ed90: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
eda0: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69  /* set our certi
edb0: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f  ficate */.    lo
edc0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
edd0: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74   0;.    if (cert
ede0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
edf0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  .load_private_ke
ee00: 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c  y = 1;...if (SSL
ee10: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
ee20: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46  cate_file(ctx, F
ee30: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73  2N(certfile, &ds
ee40: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
ee50: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  PEM) <= 0) {..  
ee60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
ee70: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
ee80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ee90: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
eea0: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
eeb0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
eec0: 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20 47  e, ": ",...    G
eed0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
eee0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
eef0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
ef00: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
ef10: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63  urn NULL;..}..Tc
ef20: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
ef30: 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  s);..    } else 
ef40: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c  if (cert != NULL
ef50: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
ef60: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28  e_key = 1;..if (
ef70: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74  SSL_CTX_use_cert
ef80: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78  ificate_ASN1(ctx
ef90: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74  , cert_len, cert
efa0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
efb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
efc0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
efd0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
efe0: 74 65 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54  te: ",...    GET
eff0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
f000: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
f010: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
f020: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
f030: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  n NULL;..}.    }
f040: 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c   else {..certfil
f050: 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f  e = (char*)X509_
f060: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74  get_default_cert
f070: 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53  _file();...if (S
f080: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
f090: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
f0a0: 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46   certfile, SSL_F
f0b0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
f0c0: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20  0) {.#if 0..    
f0d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f0e0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
f0f0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
f100: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
f110: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
f120: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52   ",...    GET_ER
f130: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
f140: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
f150: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f160: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f170: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20  ULL;.#endif..}. 
f180: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74     }..    /* set
f190: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79   our private key
f1a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64   */.    if (load
f1b0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a  _private_key) {.
f1c0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20  .if (keyfile == 
f1d0: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e  NULL && key == N
f1e0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66  ULL) {..    keyf
f1f0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
f200: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  .}...if (keyfile
f210: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
f220: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76   /* get the priv
f230: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  ate key associat
f240: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72  ed with this cer
f250: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
f260: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20   if (keyfile == 
f270: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c  NULL) {...keyfil
f280: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20  e = certfile;.. 
f290: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53     }...    if (S
f2a0: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
f2b0: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20  teKey_file(ctx, 
f2c0: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73  F2N(keyfile, &ds
f2d0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
f2e0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54  PEM) <= 0) {...T
f2f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f300: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  ds);.../* flush 
f310: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
f320: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
f330: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
f340: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
f350: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
f360: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
f370: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f380: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f390: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
f3a0: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66  key file ", keyf
f3b0: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 47 45 54  ile, " ",....GET
f3c0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
f3d0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09  char *)NULL);...
f3e0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f3f0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
f400: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
f410: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f420: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  s);..} else if (
f430: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key != NULL) {..
f440: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
f450: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41  use_PrivateKey_A
f460: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41  SN1(EVP_PKEY_RSA
f470: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c  , ctx, key,key_l
f480: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a  en) <= 0) {.../*
f490: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
f4a0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
f4b0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
f4c0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
f4d0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
f4e0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
f4f0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
f500: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f510: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
f520: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47  public key: ", G
f530: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
f540: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
f550: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f560: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
f570: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f  LL;..    }..}../
f580: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68  * Now we know th
f590: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72  at a key and cer
f5a0: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  t have been set 
f5b0: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20  against.. * the 
f5c0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  SSL context */..
f5d0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65  if (!SSL_CTX_che
f5e0: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63  ck_private_key(c
f5f0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  tx)) {..    Tcl_
f600: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f610: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65  erp, "private ke
f620: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
f630: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
f640: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09   public key",...
f650: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 4e 55  .     (char *)NU
f660: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f670: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f680: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f690: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f6a0: 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 75  Set to use defau
f6b0: 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20  lt location and 
f6c0: 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 69  file for Certifi
f6d0: 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28  cate Authority (
f6e0: 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 73  CA) certificates
f6f0: 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 72  . The.     * ver
f700: 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f  ify path and sto
f710: 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  re can be overri
f720: 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f  dden by the SSL_
f730: 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72  CERT_DIR env var
f740: 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 6c  . The verify fil
f750: 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 20  e can.     * be 
f760: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
f770: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20  e SSL_CERT_FILE 
f780: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20  env var. */.    
f790: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74  if (!SSL_CTX_set
f7a0: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f  _default_verify_
f7b0: 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 61  paths(ctx)) {..a
f7c0: 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  bort++;.    }.. 
f7d0: 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 20     /* Overrides 
f7e0: 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 66  for the CA verif
f7f0: 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  y path and file 
f800: 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 45  */.    {.#if OPE
f810: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
f820: 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
f830: 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d  L..if (CApath !=
f840: 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20   NULL || CAfile 
f850: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
f860: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b  Tcl_DString ds1;
f870: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f880: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20  gInit(&ds1);... 
f890: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
f8a0: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61  load_verify_loca
f8b0: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43  tions(ctx, F2N(C
f8c0: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e  Afile, &ds), F2N
f8d0: 28 43 41 70 61 74 68 2c 20 26 64 73 31 29 29 29  (CApath, &ds1)))
f8e0: 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20   {...abort++;.. 
f8f0: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
f900: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f910: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
f920: 46 72 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20  Free(&ds1);...  
f930: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66    /* Set list of
f940: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20   CAs to send to 
f950: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75  client when requ
f960: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20  esting a client 
f970: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
f980: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73      /* https://s
f990: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70  ourceforge.net/p
f9a0: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f  /tls/bugs/57/ */
f9b0: 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44  ..    /* XXX:TOD
f9c0: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20  O: Let the user 
f9d0: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65  supply values he
f9e0: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f  re instead of so
f9f0: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69  mething that exi
fa00: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sts on the files
fa10: 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54  ystem */..    ST
fa20: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
fa30: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
fa40: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
fa50: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
fa60: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69  e, &ds));..    i
fa70: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
fa80: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54  NULL) {...SSL_CT
fa90: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
faa0: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
fab0: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  mes);..    }..  
fac0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
fad0: 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73  e(&ds);..}..#els
fae0: 65 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d  e..if (CApath !=
faf0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66   NULL) {..    if
fb00: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f   (!SSL_CTX_load_
fb10: 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 2c 20  verify_dir(ctx, 
fb20: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 29  F2N(CApath, &ds)
fb30: 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a  )) {...abort++;.
fb40: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
fb50: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
fb60: 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66 69 6c 65  ;..}..if (CAfile
fb70: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
fb80: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
fb90: 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63  ad_verify_file(c
fba0: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
fbb0: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74  &ds))) {...abort
fbc0: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ++;..    }..    
fbd0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
fbe0: 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53  &ds);...    /* S
fbf0: 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74  et list of CAs t
fc00: 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74  o send to client
fc10: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
fc20: 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66   a client certif
fc30: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54  icate */..    ST
fc40: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
fc50: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
fc60: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
fc70: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
fc80: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69  e, &ds));..    i
fc90: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
fca0: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54  NULL) {...SSL_CT
fcb0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
fcc0: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
fcd0: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  mes);..    }..  
fce0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
fcf0: 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69  e(&ds);..}.#endi
fd00: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  f.    }..    ret
fd10: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn ctx;.}.../*.
fd20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
fd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd60: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74  -----. *. * Stat
fd70: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  usObjCmd -- retu
fd80: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66  rn certificate f
fd90: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65  or connected pee
fda0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
fdb0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
fdc0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
fdd0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
fde0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe30: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
fe40: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 0a 20  .StatusObjCmd(. 
fe50: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
fe60: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49  id *),.    Tcl_I
fe70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
fe80: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20     int objc,.   
fe90: 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20   Tcl_Obj.*const 
fea0: 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 53 74  objv[]).{.    St
feb0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
fec0: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
fed0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
fee0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
fef0: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
ff00: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
ff10: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
ff20: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt mode;.    con
ff30: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
ff40: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73   *proto;.    uns
ff50: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20  igned int len;. 
ff60: 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b     int nid, res;
ff70: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
ff80: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
ff90: 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62   (objc < 2 || ob
ffa0: 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20  jc > 3 || (objc 
ffb0: 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28  == 3 && !strcmp(
ffc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ffd0: 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22  jv[1]), "-local"
ffe0: 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67  ))) {..Tcl_Wrong
fff0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10000 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61  1, objv, "?-loca
10010 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  l? channel");..r
10020 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10030 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
10040 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f  et channel Id */
10050 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  .    channelName
10060 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
10070 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32  (objv[(objc == 2
10080 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20   ? 1 : 2)]);.   
10090 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
100a0 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
100b0 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64  hannelName, &mod
100c0 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
100d0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
100e0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
100f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10100 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
10110 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
10120 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
10130 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
10140 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
10150 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
10160 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
10170 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
10180 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
10190 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
101a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
101b0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
101c0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
101d0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
101e0 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
101f0 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
10200 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
10210 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
10220 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22   "TLS", "STATUS"
10230 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
10240 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
10250 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
10260 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10270 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
10280 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74  State *) Tcl_Get
10290 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
102a0 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
102b0 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61  /* Get certifica
102c0 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73  te for peer or s
102d0 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  elf */.    if (o
102e0 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65  bjc == 2) {..pee
102f0 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
10300 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
10310 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
10320 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20   } else {..peer 
10330 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66  = SSL_get_certif
10340 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
10350 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
10360 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74  /* Get X509 cert
10370 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a  ificate info */.
10380 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
10390 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
103a0 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
103b0 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a   peer);..if (obj
103c0 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58  c == 2) {..    X
103d0 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a  509_free(peer);.
103e0 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c  .    peer = NULL
103f0 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
10400 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
10410 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
10420 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
10430 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a  /* Peer name */.
10440 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
10450 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10460 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f  "peername", SSL_
10470 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74  get0_peername(st
10480 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
10490 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  );.    LAPPEND_I
104a0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
104b0 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f  r, "sbits", SSL_
104c0 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28  get_cipher_bits(
104d0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e  statePtr->ssl, N
104e0 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68  ULL));..    ciph
104f0 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c  ers = (char*)SSL
10500 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
10510 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
10520 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10530 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
10540 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d  her", ciphers, -
10550 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69  1);..    /* Veri
10560 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74  fy the X509 cert
10570 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65  ificate presente
10580 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f  d by the peer */
10590 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
105a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
105b0 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c   "verifyResult",
105c0 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  ..X509_verify_ce
105d0 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
105e0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
105f0 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
10600 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  ssl)), -1);..   
10610 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
10620 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53  */.    mode = SS
10630 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64  L_get_verify_mod
10640 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
10650 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26  ;.    if (mode &
10660 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  & SSL_VERIFY_NON
10670 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  E) {..LAPPEND_ST
10680 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10690 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  , "verifyMode", 
106a0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
106b0 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
106c0 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d  bj *listObjPtr =
106d0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
106e0 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d  0, NULL);..if (m
106f0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
10700 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54  Y_PEER) {..    T
10710 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
10720 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10730 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
10740 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65  NewStringObj("pe
10750 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  er", -1));..}..i
10760 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
10770 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
10780 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20  _PEER_CERT) {.. 
10790 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
107a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
107b0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
107c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
107d0 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65  ("fail if no pee
107e0 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09  r cert", -1));..
107f0 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10800 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
10810 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63  _ONCE) {..    Tc
10820 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10830 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10840 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10850 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69  ewStringObj("cli
10860 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b  ent once", -1));
10870 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
10880 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
10890 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20  _HANDSHAKE) {.. 
108a0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
108b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
108c0 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
108d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
108e0 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65  ("post handshake
108f0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50  ", -1));..}..LAP
10900 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
10910 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
10920 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74  Mode", listObjPt
10930 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r).    }..    /*
10940 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70   Verify mode dep
10950 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  th */.    LAPPEN
10960 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10970 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70  jPtr, "verifyDep
10980 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  th", SSL_get_ver
10990 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50  ify_depth(stateP
109a0 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20  tr->ssl));..    
109b0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
109c0 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
109d0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
109e0 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  he negotiation *
109f0 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61  /.    SSL_get0_a
10a00 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61  lpn_selected(sta
10a10 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f  tePtr->ssl, &pro
10a20 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c  to, &len);.    L
10a30 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10a40 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e  p, objPtr, "alpn
10a50 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f  ", (char *)proto
10a60 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
10a70 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
10a80 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10a90 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53  r, "protocol", S
10aa0 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
10ab0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
10ac0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69  1);..    /* Vali
10ad0 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69  d for non-RSA si
10ae0 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20  gnature and TLS 
10af0 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  1.3 */.    if (o
10b00 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73  bjc == 2) {..res
10b10 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
10b20 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
10b30 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10b40 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
10b50 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
10b60 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
10b70 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10b80 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
10b90 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
10ba0 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
10bb0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10bc0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73  r, "signatureHas
10bd0 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a  hAlgorithm", OBJ
10be0 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31  _nid2ln(nid), -1
10bf0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
10c00 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20   == 2) {..res = 
10c10 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67  SSL_get_peer_sig
10c20 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
10c30 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10c40 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  nid);.    } else
10c50 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
10c60 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65  t_signature_type
10c70 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
10c80 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
10c90 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
10ca0 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41  nid = 0;}.    LA
10cb0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10cc0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61  , objPtr, "signa
10cd0 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e  tureType", OBJ_n
10ce0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
10cf0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
10d00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
10d10 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
10d20 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
10d30 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
10d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d70 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
10d80 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
10d90 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
10da0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
10db0 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
10dc0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
10dd0 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
10de0 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
10df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e30 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
10e40 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
10e50 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55  bjCmd(.    TCL_U
10e60 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20  NUSED(void *),. 
10e70 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
10e80 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f  nterp,.    int o
10e90 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  bjc,.    Tcl_Obj
10ea0 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a   *const objv[]).
10eb0 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
10ec0 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
10ed0 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
10ee0 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20   mode on */.    
10ef0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
10f00 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
10f10 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
10f20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
10f30 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
10f40 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
10f50 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
10f60 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
10f70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
10f80 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
10f90 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ion;.    const E
10fa0 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20  VP_MD *md;..    
10fb0 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
10fc0 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
10fd0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10fe0 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
10ff0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11000 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  R;.    }..    ch
11010 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
11020 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
11030 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11040 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ]), NULL);.    i
11050 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
11060 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
11070 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
11080 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
11090 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
110a0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
110b0 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
110c0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
110d0 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
110e0 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
110f0 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
11100 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
11110 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
11120 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11130 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
11140 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
11150 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
11160 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f  n),..    "\": no
11170 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
11180 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
11190 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
111a0 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
111b0 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20  , "CONNECTION", 
111c0 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
111d0 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  LID", (char *)NU
111e0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
111f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11200 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
11210 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
11220 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
11230 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
11240 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
11250 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
11260 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
11270 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
11280 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
11290 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
112a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f  = NULL) {../* co
112b0 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a  nnection state *
112c0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
112d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
112e0 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74  state", SSL_stat
112f0 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
11300 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  l), -1);.../* Ge
11310 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20  t SNI requested 
11320 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  server name */..
11330 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11340 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72  rp, objPtr, "ser
11350 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  vername", SSL_ge
11360 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
11370 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
11380 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31  E_host_name), -1
11390 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74  );.../* Get prot
113a0 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  ocol */..LAPPEND
113b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
113c0 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  Ptr, "protocol",
113d0 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e   SSL_get_version
113e0 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  (ssl), -1);.../*
113f0 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61   Renegotiation a
11400 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45  llowed */..LAPPE
11410 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11420 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74  objPtr, "renegot
11430 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c  iation_allowed",
11440 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f   SSL_get_secure_
11450 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75  renegotiation_su
11460 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73  pport((SSL *) ss
11470 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65  l));.../* Get se
11480 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
11490 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
114a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
114b0 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53  curity_level", S
114c0 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
114d0 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f  level(ssl));.../
114e0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
114f0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11500 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11510 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
11520 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65  , SSL_session_re
11530 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  used(ssl));.../*
11540 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20   Is server info 
11550 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11570 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53   "is_server", SS
11580 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29  L_is_server(ssl)
11590 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20  );.../* Is DTLS 
115a0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
115b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
115c0 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f   "is_dtls", SSL_
115d0 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20  is_dtls(ssl));. 
115e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70     }..    /* Cip
115f0 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  her info */.    
11600 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74  cipher = SSL_get
11610 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28  _current_cipher(
11620 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
11630 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pher != NULL) {.
11640 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a  .char buf[BUFSIZ
11650 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69  ] = {0};..int bi
11660 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09  ts, alg_bits;...
11670 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a  /* Cipher name *
11680 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11690 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
116a0 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50  cipher", SSL_CIP
116b0 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
116c0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
116d0 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  RFC name of ciph
116e0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
116f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11700 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d  r, "standard_nam
11710 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73  e", SSL_CIPHER_s
11720 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
11730 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11740 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20  OpenSSL name of 
11750 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11760 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11770 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f  bjPtr, "openssl_
11780 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63  name", OPENSSL_c
11790 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43  ipher_name(SSL_C
117a0 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
117b0 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31  ame(cipher)), -1
117c0 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f  );.../* number o
117d0 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73  f secret bits us
117e0 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f  ed for cipher */
117f0 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50  ..bits = SSL_CIP
11800 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70  HER_get_bits(cip
11810 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b  her, &alg_bits);
11820 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11830 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11840 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74  ecret_bits", bit
11850 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
11860 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11870 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73   "algorithm_bits
11880 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f  ", alg_bits);../
11890 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63  * alg_bits is ac
118a0 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20  tual key secret 
118b0 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74  bits. If use bit
118c0 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c  s and secret (al
118d0 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69  gorithm) bits di
118e0 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65  ffer,..   the re
118f0 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61  st of the bits a
11900 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66  re fixed, i.e. f
11910 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72  or limited expor
11920 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20  t ciphers (bits 
11930 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e  < 56) */.../* In
11940 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53  dicates which SS
11950 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76  L/TLS protocol v
11960 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66  ersion first def
11970 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20  ined the cipher 
11980 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11990 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
119a0 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53  "min_version", S
119b0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
119c0 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
119d0 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  1);.../* Cipher 
119e0 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  NID */..LAPPEND_
119f0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11a00 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c  tr, "cipherNID",
11a10 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
11a20 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
11a30 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69  et_cipher_nid(ci
11a40 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
11a50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11a60 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73  , objPtr, "diges
11a70 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  tNID", (char *)O
11a80 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
11a90 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f  PHER_get_digest_
11aa0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11ab0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11ac0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11ad0 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22  "keyExchangeNID"
11ae0 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11af0 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11b00 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65  get_kx_nid(ciphe
11b10 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
11b20 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11b30 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69  bjPtr, "authenti
11b40 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61  cationNID", (cha
11b50 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
11b60 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75  SL_CIPHER_get_au
11b70 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  th_nid(cipher)),
11b80 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61   -1);.../* messa
11b90 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ge authenticatio
11ba0 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20  n code - Cipher 
11bb0 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43  is AEAD (e.g. GC
11bc0 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f  M or ChaCha20/Po
11bd0 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a  ly1305) or not *
11be0 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61  /../* Authentica
11bf0 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77  ted Encryption w
11c00 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64  ith associated d
11c10 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b  ata (AEAD) check
11c20 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
11c30 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
11c40 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61  , "cipher_is_aea
11c50 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69  d", SSL_CIPHER_i
11c60 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b  s_aead(cipher));
11c70 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65  .../* Digest use
11c80 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c  d during the SSL
11c90 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77  /TLS handshake w
11ca0 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69  hen using the ci
11cb0 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53  pher. */..md = S
11cc0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61  SL_CIPHER_get_ha
11cd0 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63  ndshake_digest(c
11ce0 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44  ipher);..LAPPEND
11cf0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11d00 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f  Ptr, "handshake_
11d10 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a  digest", (char *
11d20 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29  )EVP_MD_name(md)
11d30 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
11d40 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63  OpenSSL-specific
11d50 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44   ID, not IANA ID
11d60 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
11d70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11d80 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69   "cipher_id", (i
11d90 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
11da0 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  et_id(cipher));.
11db0 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44  ../* Two-byte ID
11dc0 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53   used in the TLS
11dd0 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65   protocol of the
11de0 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f   given cipher */
11df0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11e00 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
11e10 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e  rotocol_id", (in
11e20 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  t) SSL_CIPHER_ge
11e30 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69  t_protocol_id(ci
11e40 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78  pher));.../* Tex
11e50 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  tual description
11e60 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a   of the cipher *
11e70 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  /..if (SSL_CIPHE
11e80 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69  R_description(ci
11e90 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f  pher, buf, sizeo
11ea0 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
11eb0 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f   {..    LAPPEND_
11ec0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11ed0 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e  tr, "description
11ee0 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a  ", buf, -1);..}.
11ef0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
11f00 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
11f10 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
11f20 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
11f30 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
11f40 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
11f50 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11f60 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
11f70 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
11f80 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
11f90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11fa0 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a  r *session_id, *
11fb0 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
11fc0 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c   char buffer[SSL
11fd0 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
11fe0 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
11ff0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
12000 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
12010 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
12020 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
12030 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
12040 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
12050 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
12060 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  o, &len2);..LAPP
12070 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12080 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
12090 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
120a0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
120b0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
120c0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
120d0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
120e0 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
120f0 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
12100 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
12110 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
12120 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
12130 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
12140 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12150 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22  p, objPtr, "npn"
12160 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
12170 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12180 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  n);.#endif.../* 
12190 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
121a0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  n */..LAPPEND_BO
121b0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
121c0 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  r, "resumable", 
121d0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72  SSL_SESSION_is_r
121e0 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e  esumable(session
121f0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
12200 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
12210 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
12220 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
12230 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
12240 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c  r, "start_time",
12250 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12260 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b  _time(session));
12270 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61  .../* Timeout va
12280 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65  lue - SSL_CTX_ge
12290 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65  t_timeout (in se
122a0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
122b0 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
122c0 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74  objPtr, "timeout
122d0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
122e0 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
122f0 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
12300 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
12310 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
12320 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
12330 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12340 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
12350 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
12360 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
12370 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22  tr, "session_id"
12380 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
12390 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
123a0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e  ../* Session con
123b0 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  text */..session
123c0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
123d0 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
123e0 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  t(session, &ulen
123f0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
12400 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
12410 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  r, "session_cont
12420 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ext", session_id
12430 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12440 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
12450 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
12460 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
12470 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
12480 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
12490 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
124a0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
124b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
124c0 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69  sion_ticket", ti
124d0 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
124e0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73   len2);.../* Ses
124f0 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
12500 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
12510 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
12520 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
12530 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d  objPtr, "lifetim
12540 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
12550 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
12560 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
12570 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
12580 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20  app data */.#if 
12590 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
125a0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
125b0 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f  000L..SSL_SESSIO
125c0 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
125d0 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49  pdata((SSL_SESSI
125e0 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26  ON *) session, &
125f0 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
12600 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
12610 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12620 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61  "ticket_app_data
12630 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  ", ticket, (Tcl_
12640 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e  Size) len2);.#en
12650 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  dif.../* Get mas
12660 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
12670 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12680 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
12690 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
126a0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
126b0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
126c0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
126d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
126e0 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
126f0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12700 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73  );.../* Compress
12710 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67  ion id */..unsig
12720 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c  ned int id = SSL
12730 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d  _SESSION_get_com
12740 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e  press_id(session
12750 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12760 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12770 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22  "compression_id"
12780 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69  , id == 1 ? "zli
12790 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  b" : "none", -1)
127a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
127b0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
127c0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
127d0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
127e0 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
127f0 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
12800 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
12810 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
12820 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
12830 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
12840 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
12850 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
12860 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50  ion(ssl);...LAPP
12870 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12880 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
12890 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53  sion", comp ? SS
128a0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
128b0 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  comp) : "none", 
128c0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
128d0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
128e0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65  , "expansion", e
128f0 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  xpn ? SSL_COMP_g
12900 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20  et_name(expn) : 
12910 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c  "none", -1);.#el
12920 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  se..LAPPEND_STR(
12930 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12940 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22  "compression", "
12950 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
12960 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12970 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
12980 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
12990 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
129a0 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
129b0 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f  nfo */.    {..lo
129c0 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54  ng mode = SSL_CT
129d0 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_get_session_ca
129e0 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
129f0 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a  r->ctx);..char *
12a00 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20  msg;...if (mode 
12a10 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
12a20 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
12a30 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
12a40 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
12a50 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
12a60 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
12a70 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
12a80 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12a90 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
12aa0 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
12ab0 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
12ac0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
12ad0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
12ae0 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
12af0 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
12b00 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
12b10 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50  nknown";..}..LAP
12b20 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12b30 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
12b40 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d  n_cache_mode", m
12b50 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  sg, -1);.    }..
12b60 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
12b70 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
12b80 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
12b90 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
12ba0 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
12bb0 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
12bc0 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
12bd0 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
12be0 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
12bf0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
12c00 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
12c10 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
12c20 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
12c30 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
12c40 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
12c50 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
12c60 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
12c70 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d  ];..for (int i =
12c80 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f   0; i < sk_X509_
12c90 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
12ca0 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58  ); i++) {..    X
12cb0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d  509_NAME *name =
12cc0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61   sk_X509_NAME_va
12cd0 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b  lue(ca_list, i);
12ce0 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20  ..    if (name) 
12cf0 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e  {...X509_NAME_on
12d00 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66  eline(name, buff
12d10 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54  er, BUFSIZ);...T
12d20 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12d30 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12d40 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77  listPtr, Tcl_New
12d50 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
12d60 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09  , -1));..    }..
12d70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50  }.    }.    LAPP
12d80 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
12d90 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22  objPtr, "caList"
12da0 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20  , listPtr);.    
12db0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
12dc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
12dd0 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35  istCount", sk_X5
12de0 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c  09_NAME_num(ca_l
12df0 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ist));..    Tcl_
12e00 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12e10 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
12e20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12e30 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12e80 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  . * VersionObjCm
12e90 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73  d -- return vers
12ea0 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ion string from 
12eb0 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
12ec0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
12ed0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
12ee0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
12ef0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
12f00 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
12f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f40 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
12f50 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62  ic int.VersionOb
12f60 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
12f70 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
12f80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
12f90 74 65 72 70 2c 0a 20 20 20 20 54 43 4c 5f 55 4e  terp,.    TCL_UN
12fa0 55 53 45 44 28 69 6e 74 29 20 2f 2a 20 6f 62 6a  USED(int) /* obj
12fb0 63 20 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e  c */,.    TCL_UN
12fc0 55 53 45 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 6f  USED(Tcl_Obj *co
12fd0 6e 73 74 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 2a  nst *) /* objv *
12fe0 2f 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  /).{.    Tcl_Obj
12ff0 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64   *objPtr;..    d
13000 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
13010 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
13020 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13030 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e  (OPENSSL_VERSION
13040 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20  _TEXT, -1);..   
13050 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
13060 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
13070 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13080 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
13090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130d0 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a  --. *. * MiscObj
130e0 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d  Cmd -- misc comm
130f0 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ands. *. * Resul
13100 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
13110 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
13120 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
13130 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13180 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
13190 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 0a 20  nt.MiscObjCmd(. 
131a0 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
131b0 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49  id *),.    Tcl_I
131c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
131d0 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20     int objc,.   
131e0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
131f0 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 74  objv[]).{.    st
13200 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
13210 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b  *commands [] = {
13220 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22   "req", "strreq"
13230 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e  , NULL };.    en
13240 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52  um command { C_R
13250 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f  EQ, C_STRREQ, C_
13260 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c  DUMMY };.    Tcl
13270 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69  _Size cmd;.    i
13280 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68  nt isStr;.    ch
13290 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d  ar buffer[16384]
132a0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
132b0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
132c0 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
132d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
132e0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
132f0 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
13300 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
13310 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13320 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
13330 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
13340 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
13350 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
13360 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54  ", 0, &cmd) != T
13370 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
13380 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13390 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
133a0 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
133b0 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43  sStr = (cmd == C
133c0 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77  _STRREQ);.    sw
133d0 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d  itch ((enum comm
133e0 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73  and) cmd) {..cas
133f0 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43  e C_REQ:..case C
13400 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20  _STRREQ: {..    
13410 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e  EVP_PKEY *pkey=N
13420 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a  ULL;..    X509 *
13430 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  cert=NULL;..    
13440 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d  X509_NAME *name=
13450 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f  NULL;..    Tcl_O
13460 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20  bj **listv;..   
13470 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 2c   Tcl_Size listc,
13480 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75  i;...    BIO *ou
13490 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 6f  t=NULL;...    co
134a0 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22  nst char *k_C=""
134b0 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22  ,*k_ST="",*k_L="
134c0 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d  ",*k_O="",*k_OU=
134d0 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45  "",*k_CN="",*k_E
134e0 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68  mail="";..    ch
134f0 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f  ar *keyout,*pemo
13500 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e  ut,*str;..    in
13510 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c  t keysize,serial
13520 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69  =0,days=365;..#i
13530 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
13540 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
13550 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e  00000L..    BIGN
13560 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a  UM *bne = NULL;.
13570 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20  .    RSA *rsa = 
13580 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20  NULL;.#else..   
13590 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63   EVP_PKEY_CTX *c
135a0 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  tx = NULL;.#endi
135b0 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a  f...    if ((obj
135c0 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29  c<5) || (objc>6)
135d0 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e  ) {...Tcl_WrongN
135e0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
135f0 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65  , objv, "keysize
13600 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c   keyfile certfil
13610 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65  e ?info?");...re
13620 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13630 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
13640 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
13650 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
13660 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d  2], &keysize) !=
13670 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74   TCL_OK) {...ret
13680 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13690 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75      }..    keyou
136a0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
136b0 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70  objv[3]);..    p
136c0 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  emout=Tcl_GetStr
136d0 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20  ing(objv[4]);.. 
136e0 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a     if (isStr) {.
136f0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
13700 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29  erp,keyout,"",0)
13710 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69  ;...Tcl_SetVar(i
13720 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c  nterp,pemout,"",
13730 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  0);..    }...   
13740 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a   if (objc>=6) {.
13750 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62  ..if (Tcl_ListOb
13760 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
13770 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c  erp, objv[5], &l
13780 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d  istc, &listv) !=
13790 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20   TCL_OK) {...   
137a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
137b0 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c  R;...}....if ((l
137c0 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a  istc%2) != 0) {.
137d0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
137e0 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f  ult(interp,"Info
137f0 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73  rmation list mus
13800 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62  t have even numb
13810 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22  er of arguments"
13820 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
13830 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13840 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20  ..}...for (i=0; 
13850 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b  i<listc; i+=2) {
13860 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47  ...    str=Tcl_G
13870 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13880 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74  ]);...    if (st
13890 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29  rcmp(str,"days")
138a0 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
138b0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
138c0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
138d0 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b  ],&days)!=TCL_OK
138e0 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
138f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
13900 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13910 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29  mp(str,"serial")
13920 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
13930 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13940 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
13950 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f  ],&serial)!=TCL_
13960 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
13970 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
13980 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13990 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30  rcmp(str,"C")==0
139a0 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47  ) {....k_C=Tcl_G
139b0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
139c0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
139d0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
139e0 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"ST")==0) {...
139f0 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72  .k_ST=Tcl_GetStr
13a00 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
13a10 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13a20 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22   (strcmp(str,"L"
13a30 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54  )==0) {....k_L=T
13a40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13a50 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13a60 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13a70 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b  p(str,"O")==0) {
13a80 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53  ....k_O=Tcl_GetS
13a90 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13aa0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13ab0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13ac0 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  OU")==0) {....k_
13ad0 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  OU=Tcl_GetString
13ae0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13af0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13b00 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d  trcmp(str,"CN")=
13b10 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63  =0) {....k_CN=Tc
13b20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13b30 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13b40 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13b50 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30  (str,"Email")==0
13b60 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54  ) {....k_Email=T
13b70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13b80 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13b90 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f  } else {....Tcl_
13ba0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
13bb0 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65  ,"Unknown parame
13bc0 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72  ter",NULL);....r
13bd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13be0 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
13bf0 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
13c00 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
13c10 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20  < 0x30000000L.. 
13c20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28     bne = BN_new(
13c30 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53  );..    rsa = RS
13c40 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b  A_new();..    pk
13c50 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65  ey = EVP_PKEY_ne
13c60 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e  w();..    if (bn
13c70 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61  e == NULL || rsa
13c80 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79   == NULL || pkey
13c90 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f   == NULL || !BN_
13ca0 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41  set_word(bne,RSA
13cb0 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67  _F4) ||...!RSA_g
13cc0 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72  enerate_key_ex(r
13cd0 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65  sa, keysize, bne
13ce0 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f  , NULL) || !EVP_
13cf0 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28  PKEY_assign_RSA(
13d00 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09  pkey, rsa)) {...
13d10 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
13d20 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72  ey);.../* RSA_fr
13d30 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62  ee(rsa); freed b
13d40 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20  y EVP_PKEY_free 
13d50 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65  */...BN_free(bne
13d60 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b  );.#else..    pk
13d70 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e  ey = EVP_RSA_gen
13d80 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 6b  ((unsigned int)k
13d90 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
13da0 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
13db0 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
13dc0 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
13dd0 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
13de0 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
13df0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
13e00 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
13e10 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
13e20 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
13e30 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
13e40 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
13e50 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
13e60 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
13e70 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
13e80 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
13e90 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
13ea0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
13eb0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
13ec0 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
13ed0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13ee0 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
13ef0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
13f00 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
13f10 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
13f20 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
13f30 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
13f40 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
13f50 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
13f60 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
13f70 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
13f80 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
13f90 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
13fa0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
13fb0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
13fc0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
13fd0 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
13fe0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
13ff0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
14000 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
14010 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
14020 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
14030 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
14040 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
14050 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
14060 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
14070 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
14080 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
14090 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
140a0 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
140b0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
140c0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
140d0 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
140e0 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
140f0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
14100 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
14110 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
14120 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
14130 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
14140 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
14150 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
14160 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
14170 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
14180 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
14190 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
141a0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
141b0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
141c0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
141d0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
141e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
141f0 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73  R;...}....X509_s
14200 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c  et_version(cert,
14210 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47  2);...ASN1_INTEG
14220 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f  ER_set(X509_get_
14230 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72  serialNumber(cer
14240 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35  t),serial);...X5
14250 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
14260 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72  09_getm_notBefor
14270 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35  e(cert),0);...X5
14280 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
14290 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72  09_getm_notAfter
142a0 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
142b0 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
142c0 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
142d0 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61  ert,pkey);....na
142e0 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a  me=X509_get_subj
142f0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a  ect_name(cert);.
14300 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14310 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14320 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47  me,"C", MBSTRING
14330 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14340 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14350 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  C, -1, -1, 0);..
14360 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14370 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14380 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"ST", MBSTRING_
14390 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
143a0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53  gned char *) k_S
143b0 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  T, -1, -1, 0);..
143c0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
143d0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
143e0 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"L", MBSTRING_A
143f0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14400 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c  ned char *) k_L,
14410 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14420 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14430 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14440 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  O", MBSTRING_ASC
14450 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14460 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d  d char *) k_O, -
14470 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14480 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14490 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55  _by_txt(name,"OU
144a0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
144b0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
144c0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d   char *) k_OU, -
144d0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
144e0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
144f0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e  _by_txt(name,"CN
14500 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14510 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14520 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
14530 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14540 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14550 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
14560 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
14570 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14580 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d  ned char *) k_Em
14590 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  ail, -1, -1, 0);
145a0 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62  ....X509_set_sub
145b0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e  ject_name(cert,n
145c0 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35  ame);....if (!X5
145d0 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65  09_sign(cert,pke
145e0 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29  y,EVP_sha256()))
145f0 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72   {...    X509_fr
14600 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ee(cert);...    
14610 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14620 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
14630 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
14640 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
14650 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
14660 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54  ;.#endif...    T
14670 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14680 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69  erp,"Error signi
14690 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c  ng certificate",
146a0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
146b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
146c0 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29  .}....if (isStr)
146d0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
146e0 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
146f0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
14700 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
14710 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42  cert);...    i=B
14720 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
14730 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
14740 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
14750 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
14760 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
14770 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
14780 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
14790 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
147a0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
147b0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
147c0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
147d0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
147e0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
147f0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
14800 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
14810 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,pemout);...    
14820 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
14830 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
14840 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
14850 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  (out);...}....X5
14860 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
14870 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
14880 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
14890 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
148a0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
148b0 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
148c0 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a  endif..    }..}.
148d0 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
148e0 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
148f0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
14900 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a  L_OK;.}.../*****
14910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14920 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20  ./* Init        
14930 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
14940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
14950 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14990 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
149a0 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a  ls_Free --. *. *
149b0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
149c0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
149d0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
149e0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
149f0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
14a00 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
14a10 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a  alls below 1. *.
14a20 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
14a30 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
14a40 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
14a50 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
14a60 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14aa0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
14ab0 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72  .Tls_Free(tls_fr
14ac0 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74  ee_type *blockPt
14ad0 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  r) {.    State *
14ae0 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
14af0 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20  e *)blockPtr;.. 
14b00 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14b10 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43  ed");..    Tls_C
14b20 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a  lean(statePtr);.
14b30 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b      ckfree(block
14b40 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b90 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65  --. *. * Tls_Cle
14ba0 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  an --. *. *.This
14bb0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
14bc0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
14bd0 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
14be0 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
14bf0 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
14c00 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
14c10 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73  below 1.  This s
14c20 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c  hould. *.be call
14c30 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  ed synchronously
14c40 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f   by the ClosePro
14c50 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a  c, not in the. *
14c60 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  .EventuallyFree 
14c70 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20  callback.. *. * 
14c80 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
14c90 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
14ca0 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
14cb0 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
14cc0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d00 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c  ----. */.void Tl
14d10 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73  s_Clean(State *s
14d20 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64  tatePtr) {.    d
14d30 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14d40 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
14d50 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
14d60 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20  here that we're 
14d70 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a  single-threaded.
14d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
14d90 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
14da0 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
14db0 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
14dc0 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
14dd0 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
14de0 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
14df0 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20  >timer = NULL;. 
14e00 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
14e10 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20  atePtr->protos) 
14e20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50  {..ckfree(stateP
14e30 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74  tr->protos);..st
14e40 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
14e50 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14e60 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62   if (statePtr->b
14e70 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77  io) {../* This w
14e80 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75  ill call SSL_shu
14e90 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30  tdown. Bug 14140
14ea0 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22  45 */..dprintf("
14eb0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29  BIO_free_all(%p)
14ec0 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ", statePtr->bio
14ed0 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  );..BIO_free_all
14ee0 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
14ef0 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20  ..statePtr->bio 
14f00 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14f10 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14f20 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ssl) {..dprintf(
14f30 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20  "SSL_free(%p)", 
14f40 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
14f50 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50  .SSL_free(stateP
14f60 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65  tr->ssl);..state
14f70 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b  Ptr->ssl = NULL;
14f80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14f90 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a  tatePtr->ctx) {.
14fa0 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74  .SSL_CTX_free(st
14fb0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73  atePtr->ctx);..s
14fc0 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e  tatePtr->ctx = N
14fd0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14fe0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
14ff0 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65  lback) {..Tcl_De
15000 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
15010 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
15020 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  .statePtr->callb
15030 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ack = NULL;.    
15040 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15050 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a  tr->password) {.
15060 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
15070 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
15080 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72  word);..statePtr
15090 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c  ->password = NUL
150a0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
150b0 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
150c0 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
150d0 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
150e0 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  cmd);..statePtr-
150f0 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >vcmd = NULL;.  
15100 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
15110 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d  ("Returning");.}
15120 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
15130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
15170 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20  *. * Build Info 
15180 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a  Command --. *. *
15190 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20  .Create command 
151a0 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20  to return build 
151b0 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65  info for package
151c0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
151d0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
151e0 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20  cl result. *. * 
151f0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
15200 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69  .Created build-i
15210 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a  nfo command.. *.
15220 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15260 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69  --------. */..#i
15270 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a  fndef STRINGIFY.
15280 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47  #  define STRING
15290 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 59  IFY(x) STRINGIFY
152a0 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53  1(x).#  define S
152b0 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a  TRINGIFY1(x) #x.
152c0 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c  #endif..int.Buil
152d0 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c  dInfoCommand(Tcl
152e0 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29  _Interp* interp)
152f0 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e   {.    Tcl_CmdIn
15300 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66  fo info;..    if
15310 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   (Tcl_GetCommand
15320 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a  Info(interp, "::
15330 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22  tcl::build-info"
15340 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c  , &info)) {..Tcl
15350 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15360 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
15370 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69  ::build-info", i
15380 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f  nfo.objProc, (vo
15390 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45  id *)(...PACKAGE
153a0 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52  _VERSION "+" STR
153b0 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49  INGIFY(TLS_VERSI
153c0 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66  ON_UUID).#if def
153d0 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20  ined(__clang__) 
153e0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  && defined(__cla
153f0 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20  ng_major__).... 
15400 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52     ".clang-" STR
15410 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d  INGIFY(__clang_m
15420 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c  ajor__).#if __cl
15430 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30  ang_minor__ < 10
15440 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64  ....    "0".#end
15450 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47  if....    STRING
15460 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f  IFY(__clang_mino
15470 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20  r__).#endif.#if 
15480 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70  defined(__cplusp
15490 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e 65 64  lus) && !defined
154a0 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20  (__OBJC__)....  
154b0 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23    ".cplusplus".#
154c0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44  endif.#ifndef ND
154d0 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65  EBUG....    ".de
154e0 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20  bug".#endif.#if 
154f0 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67  !defined(__clang
15500 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
15510 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52  __INTEL_COMPILER
15520 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47  ) && defined(__G
15530 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e  NUC__)....    ".
15540 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28  gcc-" STRINGIFY(
15550 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f  __GNUC__).#if __
15560 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31  GNUC_MINOR__ < 1
15570 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e  0....    "0".#en
15580 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e  dif....    STRIN
15590 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f  GIFY(__GNUC_MINO
155a0 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  R__).#endif.#ifd
155b0 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  ef __INTEL_COMPI
155c0 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63  LER....    ".icc
155d0 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49  -" STRINGIFY(__I
155e0 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23  NTEL_COMPILER).#
155f0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c  endif.#ifdef TCL
15600 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20  _MEM_DEBUG....  
15610 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65    ".memdebug".#e
15620 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
15630 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20  (_MSC_VER)....  
15640 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e    ".msvc-" STRIN
15650 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23  GIFY(_MSC_VER).#
15660 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53 45  endif.#ifdef USE
15670 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e  _NMAKE....    ".
15680 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69  nmake".#endif.#i
15690 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50  fndef TCL_CFG_OP
156a0 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22  TIMIZED....    "
156b0 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65  .no-optimize".#e
156c0 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42  ndif.#ifdef __OB
156d0 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62  JC__....    ".ob
156e0 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64  jective-c".#if d
156f0 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c  efined(__cpluspl
15700 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73  us)....    "plus
15710 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e  plus".#endif.#en
15720 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43  dif.#ifdef TCL_C
15730 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20  FG_PROFILED.... 
15740 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65     ".profile".#e
15750 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 52 49  ndif.#ifdef PURI
15760 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69  FY....    ".puri
15770 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  fy".#endif.#ifde
15780 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09  f STATIC_BUILD..
15790 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a  ..    ".static".
157a0 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c  #endif...), NULL
157b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
157c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
157d0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15810 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
15820 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  ls_Init --. *. *
15830 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61  .This is a packa
15840 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ge initializatio
15850 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69  n procedure, whi
15860 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  ch is called. *.
15870 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73  by Tcl when this
15880 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62   package is to b
15890 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e  e added to an in
158a0 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a  terpreter.. *. *
158b0 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63   Results:  Ssl c
158c0 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f  onfigured and lo
158d0 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20  aded. *. * Side 
158e0 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65  effects:. *. cre
158f0 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d  ate the ssl comm
15900 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20  and, initialize 
15910 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20  ssl context. *. 
15920 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15960 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43  ----. */..#if TC
15970 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
15980 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  > 8.#define MIN_
15990 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65  VERSION "9.0".#e
159a0 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  lse.#define MIN_
159b0 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65  VERSION "8.5".#e
159c0 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e  ndif..static con
159d0 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e  st char tlsTclIn
159e0 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23  itScript[] = {.#
159f0 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c  include "tls.tcl
15a00 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b  .h"..0x00.    };
15a10 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  ..DLLEXPORT int 
15a20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Tls_Init(Tcl_Int
15a30 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a  erp *interp) {..
15a40 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
15a50 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55  led");..#ifdef U
15a60 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20  SE_TCL_STUBS.   
15a70 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75   if (Tcl_InitStu
15a80 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56  bs(interp, MIN_V
15a90 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55  ERSION, 0) == NU
15aa0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
15ab0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
15ac0 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63  endif.    if (Tc
15ad0 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
15ae0 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f  erp, "Tcl", MIN_
15af0 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e  VERSION, 0) == N
15b00 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
15b10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15b20 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
15b30 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  nit(0) != TCL_OK
15b40 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
15b50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
15b60 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
15b70 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
15b80 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
15b90 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
15ba0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
15bb0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15bc0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
15bd0 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69  ls::ciphers", Ci
15be0 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 76 6f  phersObjCmd, (vo
15bf0 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  id *) NULL, (Tcl
15c00 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15c10 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15c20 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15c30 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
15c40 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43  ::connection", C
15c50 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
15c60 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55  Cmd, (void *) NU
15c70 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
15c80 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15c90 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15ca0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15cb0 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68  , "::tls::handsh
15cc0 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f  ake", HandshakeO
15cd0 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20  bjCmd, (void *) 
15ce0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
15cf0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15d00 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15d10 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15d20 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f  rp, "::tls::impo
15d30 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  rt", ImportObjCm
15d40 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c  d, (void *) NULL
15d50 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15d60 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15d70 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15d80 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15d90 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74  "::tls::unimport
15da0 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  ", UnimportObjCm
15db0 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c  d, (void *) NULL
15dc0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15dd0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15de0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15df0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15e00 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c  "::tls::status",
15e10 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28   StatusObjCmd, (
15e20 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54  void *) NULL, (T
15e30 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15e40 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15e50 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15e60 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
15e70 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65  ls::version", Ve
15e80 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 76 6f  rsionObjCmd, (vo
15e90 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  id *) NULL, (Tcl
15ea0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15eb0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15ec0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15ed0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
15ee0 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a  ::misc", MiscObj
15ef0 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55  Cmd, (void *) NU
15f00 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
15f10 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15f20 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15f30 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15f40 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63  , "::tls::protoc
15f50 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f  ols", ProtocolsO
15f60 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20  bjCmd, (void *) 
15f70 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
15f80 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15f90 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66  );..    BuildInf
15fa0 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29  oCommand(interp)
15fb0 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72  ;..    if (inter
15fc0 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 69 6e  p && Tcl_Eval(in
15fd0 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74  terp, tlsTclInit
15fe0 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f  Script) != TCL_O
15ff0 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
16000 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
16010 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b     return Tcl_Pk
16020 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
16030 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50   PACKAGE_NAME, P
16040 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
16050 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
16060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16090 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49  . *. *.Tls_SafeI
160a0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
160b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
160e0 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65  *.Standard proce
160f0 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62 79  dure required by
16100 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74   'load'.. *.Init
16110 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74  ializes this ext
16120 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66  ension for a saf
16130 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  e interpreter.. 
16140 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
16150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16170 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
16180 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f  ffects:. *..As o
16190 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a  f 'Tls_Init'. *.
161a0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41   *.Result:. *..A
161b0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72   standard Tcl er
161c0 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  ror code.. *. *-
161d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16200 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 4c 4c 45  -----*. */..DLLE
16210 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61  XPORT int Tls_Sa
16220 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
16230 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
16240 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
16250 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
16260 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ls_Init(interp);
16270 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
162b0 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69  . *. *.TlsLibIni
162c0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  t --. *. *.-----
162d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
16300 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  Initializes SSL 
16310 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72  library once per
16320 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09   application. *.
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16360 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66  *. *. *.Side eff
16370 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61  ects:. *..initia
16380 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
16390 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  y. *. *.Result:.
163a0 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d   *..none. *. *--
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163e0 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ----*. */.static
163f0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28   int TlsLibInit(
16400 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  int uninitialize
16410 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  ) {.    static i
16420 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  nt initialized =
16430 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74   0;.    int stat
16440 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66  us = TCL_OK;.#if
16450 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16460 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16470 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16480 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d  ).    size_t num
16490 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a  _locks;.#endif..
164a0 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61      if (uninitia
164b0 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e  lize) {..if (!in
164c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20  itialized) {..  
164d0 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64    dprintf("Asked
164e0 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   to uninitialize
164f0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74  , but we are not
16500 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a   initialized");.
16510 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
16520 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74  _OK;..}...dprint
16530 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e  f("Asked to unin
16540 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66  itialize");..#if
16550 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16560 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16570 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16580 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b  )..Tcl_MutexLock
16590 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66  (&init_mx);...if
165a0 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20   (locks) {..    
165b0 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20  free(locks);..  
165c0 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a    locks = NULL;.
165d0 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20  .    locksCount 
165e0 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09  = 0;..}.#endif..
165f0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
16600 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
16610 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
16620 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
16630 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
16640 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  xUnlock(&init_mx
16650 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  );.#endif...retu
16660 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
16670 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61  ..    if (initia
16680 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74  lized) {..dprint
16690 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75  f("Called, but u
166a0 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75  sing cached valu
166b0 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61  e");..return sta
166c0 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tus;.    }..    
166d0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
166e0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
166f0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
16700 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
16710 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c  THREADS).    Tcl
16720 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
16730 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  _mx);.#endif.   
16740 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31   initialized = 1
16750 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
16760 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16770 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16780 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f  HREADS).    num_
16790 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c  locks = 1;.    l
167a0 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74  ocksCount = (int
167b0 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20  ) num_locks;.   
167c0 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28   locks = malloc(
167d0 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a  sizeof(*locks) *
167e0 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20   num_locks);.   
167f0 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30   memset(locks, 0
16800 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29  , sizeof(*locks)
16810 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23   * num_locks);.#
16820 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e  endif..    /* In
16830 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69  itialize BOTH li
16840 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73  bcrypto and libs
16850 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53  sl. */.    OPENS
16860 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e  SL_init_ssl(OPEN
16870 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53  SSL_INIT_LOAD_SS
16880 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e  L_STRINGS | OPEN
16890 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52  SSL_INIT_LOAD_CR
168a0 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20  YPTO_STRINGS..| 
168b0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44  OPENSSL_INIT_ADD
168c0 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f  _ALL_CIPHERS | O
168d0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
168e0 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c  ALL_DIGESTS, NUL
168f0 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77  L);..    BIO_new
16900 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  _tcl(NULL, 0);..
16910 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20  #if 0.    /*.   
16920 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65    * XXX:TODO: Re
16930 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61  move this code a
16940 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  nd replace it wi
16950 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20  th a check.     
16960 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74  * for enough ent
16970 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20  ropy and do not 
16980 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75  try to create ou
16990 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72  r own.     * ter
169a0 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20  rible entropy.  
169b0 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20     */.    /*.   
169c0 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e    * Seed the ran
169d0 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
169e0 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  ator in the SSL 
169f0 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20  library,.     * 
16a00 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69  using the do/whi
16a10 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63  le construct bec
16a20 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20  ause of the bug 
16a30 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  note in the.    
16a40 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61   * OpenSSL FAQ a
16a50 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65  t http://www.ope
16a60 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74  nssl.org/support
16a70 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a  /faq.html#USER1.
16a80 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
16a90 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72  e crux of the pr
16aa0 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f  oblem is that So
16ab0 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74  laris 7 does not
16ac0 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f   have a.     * /
16ad0 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64  dev/random or /d
16ae0 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63  ev/urandom devic
16af0 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67  e so it cannot g
16b00 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20  ather enough.   
16b10 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d    * entropy from
16b20 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29   the RAND_seed()
16b30 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61   when TLS initia
16b40 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65  lizes and refuse
16b50 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66  s.     * to go f
16b60 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20  urther. Earlier 
16b70 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e  versions of Open
16b80 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72  SSL carried on r
16b90 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
16ba0 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e  */.    srand((un
16bb0 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65  signed int) time
16bc0 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c  ((time_t *) NULL
16bd0 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f  ));.    do {..fo
16be0 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36  r (i = 0; i < 16
16bf0 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e  ; i++) {..    rn
16c00 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20  d_seed[i] = 1 + 
16c10 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20  (char) (255.0 * 
16c20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58  rand()/(RAND_MAX
16c30 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44  +1.0));..}..RAND
16c40 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20  _seed(rnd_seed, 
16c50 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29  sizeof(rnd_seed)
16c60 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  );.    } while (
16c70 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d  RAND_status() !=
16c80 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66   1);.#endif..#if
16c90 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16ca0 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16cb0 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16cc0 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55  ).    Tcl_MutexU
16cd0 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  nlock(&init_mx);
16ce0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
16cf0 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a        urn status;.}.