Hex Artifact Content

Artifact 1921191acacc3fa7e6c646110895db1253f637ae2a89d7ef32d2521cd4ce28cb:


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 6b 65  e, key, cert, ke
aa00: 79 5f 6c 65 6e 2c 0a 09 09 63 65 72 74 5f 6c 65  y_len,...cert_le
aa10: 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c  n, CApath, CAfil
aa20: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
aa30: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
aa40: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
aa50: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
aa60: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
aa70: 79 70 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b  ype *)statePtr);
aa80: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
aa90: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
aaa0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
aab0: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20  ctx = ctx;..    
aac0: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
aad0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
aae0: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hat the channel 
aaf0: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20  works in binary 
ab00: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20  (for the.     * 
ab10: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74  encryption not t
ab20: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29  o get goofed up)
ab30: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79  ..     * We only
ab40: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20   want to adjust 
ab50: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e  the buffering in
ab60: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73   pre-v2 channels
ab70: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65  , where.     * e
ab80: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74  ach channel in t
ab90: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69  he stack maintai
aba0: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66  ned its own buff
abb0: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ers..     */.   
abc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
abd0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
abe0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
abf0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
ac00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
ac10: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
ac20: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
ac30: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
ac40: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
ac50: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
ac60: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ac70: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ac80: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ac90: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
aca0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
acb0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
acc0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
acd0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ace0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
acf0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
ad00: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
ad10: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ad20: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
ad30: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
ad40: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
ad50: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
ad60: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ad70: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ad80: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
ad90: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ada0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
adb0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
adc0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
add0: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
ade0: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
adf0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ae00: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
ae10: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
ae20: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
ae30: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
ae40: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
ae50: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
ae60: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
ae70: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
ae80: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
ae90: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
aea0: 70 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c 20  pe(), statePtr, 
aeb0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20  (TCL_READABLE | 
aec0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63  TCL_WRITABLE), c
aed0: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  han);.    dprint
aee0: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e  f("Created chann
aef0: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63  el named %s", Tc
af00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
af10: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
af20: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  );.    if (state
af30: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
af40: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
af50: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73   {../*.. * No us
af60: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61  e of Tcl_Eventua
af70: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20  llyFree because 
af80: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f  no possible Tcl_
af90: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09  Preserve... */..
afa0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
afb0: 65 65 5f 74 79 70 65 20 2a 29 73 74 61 74 65 50  ee_type *)stateP
afc0: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
afd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
afe0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
aff0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
b000: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
b010: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
b020: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b030: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
b040: 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20  anslation));.   
b050: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
b060: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
b070: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
b080: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44  encoding", Tcl_D
b090: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
b0a0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
b0b0: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  g));.    Tcl_Set
b0c0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
b0d0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
b0e0: 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22  self, "-eofchar"
b0f0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b100: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b110: 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54  EOFChar));.    T
b120: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
b130: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
b140: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c  ePtr->self, "-bl
b150: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  ocking", Tcl_DSt
b160: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b170: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
b180: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b190: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b1a0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
b1b0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
b1c0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b1d0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
b1e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
b1f0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
b200: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
b210: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b220: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
b230: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ng);..    /*.   
b240: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69    * SSL Initiali
b250: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20  zation.     */. 
b260: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c     statePtr->ssl
b270: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65   = SSL_new(state
b280: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69  Ptr->ctx);.    i
b290: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73  f (!statePtr->ss
b2a0: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62  l) {../* SSL lib
b2b0: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54  rary error */..T
b2c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b2d0: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27  interp, "couldn'
b2e0: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20  t construct ssl 
b2f0: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f  session: ", GET_
b300: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b310: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63  har *)NULL);..Tc
b320: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b330: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b340: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20  MPORT", "INIT", 
b350: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b360: 2a 29 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72  *)NULL);..Tls_Fr
b370: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
b380: 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  e *)statePtr);..
b390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b3a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b3b0: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
b3c0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
b3d0: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f  servername) {../
b3e0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65  * Sets the serve
b3f0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
b400: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e  n (SNI) in Clien
b410: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e  tHello extension
b420: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20   */../* Per RFC 
b430: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69  6066, hostname i
b440: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65  s a ASCII encode
b450: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68  d string, though
b460: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55   RFC 4366 says U
b470: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53  TF-8. */..if (!S
b480: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f  SL_set_tlsext_ho
b490: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72  st_name(statePtr
b4a0: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
b4b0: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b  e) && require) {
b4c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b4d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b4e0: 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  Set SNI extensio
b4f0: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  n failed: ", GET
b500: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b510: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
b520: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b530: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b540: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e  ", "IMPORT", "SN
b550: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  I", "FAILED", (c
b560: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
b570: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
b580: 66 72 65 65 5f 74 79 70 65 20 2a 29 73 74 61 74  free_type *)stat
b590: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
b5a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
b5b0: 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61  .../* Set hostna
b5c0: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74  me for peer cert
b5d0: 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65  ificate hostname
b5e0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e   verification in
b5f0: 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f   clients...   Do
b600: 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31  n't use SSL_set1
b610: 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68  _host since it h
b620: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20  as limitations. 
b630: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64  */..if (!SSL_add
b640: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d  1_host(statePtr-
b650: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
b660: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
b670: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b680: 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74  p, "Set DNS host
b690: 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  name failed: ", 
b6a0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b6b0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b6c0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
b6d0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b6e0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b6f0: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49  "HOSTNAME", "FAI
b700: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  LED", (char *)NU
b710: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
b720: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
b730: 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  e *)statePtr);..
b740: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b750: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b760: 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65      /* Resume se
b770: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
b780: 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26  if (session_id &
b790: 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  & strlen(session
b7a0: 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _id) <= SSL_MAX_
b7b0: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
b7c0: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
b7d0: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
b7e0: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
b7f0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
b800: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
b810: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28  tePtr->ssl),...(
b820: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
b830: 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69  har *) session_i
b840: 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  d, (unsigned int
b850: 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e  ) strlen(session
b860: 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63  _id))) {..    Tc
b870: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b880: 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73  nterp, "Resume s
b890: 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22  ession failed: "
b8a0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
b8b0: 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  (), (char *)NULL
b8c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b8d0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b8e0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b8f0: 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41  , "SESSION", "FA
b900: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e  ILED", (char *)N
b910: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
b920: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
b930: 70 65 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  pe *)statePtr);.
b940: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b950: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
b960: 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41  .    /* Enable A
b970: 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72  pplication-Layer
b980: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69   Protocol Negoti
b990: 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20  ation. Examples 
b9a0: 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09  are: http/1.0,..
b9b0: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
b9c0: 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70  , ftp, imap, pop
b9d0: 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20  3, xmpp-client, 
b9e0: 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74  xmpp-server, mqt
b9f0: 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a  t, irc, etc. */.
ba00: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a      if (alpn) {.
ba10: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43  ./* Convert a TC
ba20: 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72  L list into a pr
ba30: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77  otocol-list in w
ba40: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75  ire-format */..u
ba50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
ba60: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67  otos, *p;..unsig
ba70: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c  ned int protos_l
ba80: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a  en = 0;..Tcl_Siz
ba90: 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a  e cnt, i;..int j
baa0: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73  ;..Tcl_Obj **lis
bab0: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73  t;...if (Tcl_Lis
bac0: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
bad0: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63  interp, alpn, &c
bae0: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43  nt, &list) != TC
baf0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73  L_OK) {..    Tls
bb00: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
bb10: 74 79 70 65 20 2a 29 73 74 61 74 65 50 74 72 29  type *)statePtr)
bb20: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
bb30: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
bb40: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d   Determine the m
bb50: 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66  emory required f
bb60: 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d  or the protocol-
bb70: 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20  list */..for (i 
bb80: 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b  = 0; i < cnt; i+
bb90: 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65  +) {..    Tcl_Ge
bba0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c  tStringFromObj(l
bbb0: 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09  ist[i], &len);..
bbc0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35      if (len > 25
bbd0: 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  5) {...Tcl_Appen
bbe0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bbf0: 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e  "ALPN protocol n
bc00: 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20  ames too long", 
bc10: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
bc20: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
bc30: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
bc40: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e   "IMPORT", "ALPN
bc50: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
bc60: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 6c  ar *)NULL);...Tl
bc70: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
bc80: 5f 74 79 70 65 20 2a 29 73 74 61 74 65 50 74 72  _type *)statePtr
bc90: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
bca0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20  ERROR;..    }.. 
bcb0: 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d     protos_len +=
bcc0: 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a   1 + (int) len;.
bcd0: 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68  .}.../* Build th
bce0: 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f  e complete proto
bcf0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f  col-list */..pro
bd00: 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72  tos = ckalloc(pr
bd10: 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70  otos_len);../* p
bd20: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f  rotocol-lists co
bd30: 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c  nsist of 8-bit l
bd40: 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20  ength-prefixed, 
bd50: 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a  byte strings */.
bd60: 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d  .for (j = 0, p =
bd70: 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74   protos; j < cnt
bd80: 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68  ; j++) {..    ch
bd90: 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65  ar *str = Tcl_Ge
bda0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c  tStringFromObj(l
bdb0: 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09  ist[j], &len);..
bdc0: 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69      *p++ = (unsi
bdd0: 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a  gned char) len;.
bde0: 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73  .    memcpy(p, s
bdf0: 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  tr, (size_t) len
be00: 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e  );..    p += len
be10: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65  ;..}.../* SSL_se
be20: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61  t_alpn_protos ma
be30: 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68  kes a copy of th
be40: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
be50: 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69  */../* Note: Thi
be60: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 76 65 72  s function rever
be70: 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76  ses the return v
be80: 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  alue convention 
be90: 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f  */..if (SSL_set_
bea0: 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74  alpn_protos(stat
beb0: 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f  ePtr->ssl, proto
bec0: 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20  s, protos_len)) 
bed0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
bee0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bef0: 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63  "Set ALPN protoc
bf00: 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ols failed: ", G
bf10: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
bf20: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
bf30: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
bf40: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
bf50: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
bf60: 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c  ALPN", "FAILED",
bf70: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
bf80: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
bf90: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 73  ls_free_type *)s
bfa0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63  tatePtr);..    c
bfb0: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09  kfree(protos);..
bfc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
bfd0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74  RROR;..}.../* St
bfe0: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  ore protocols li
bff0: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  st */..statePtr-
c000: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73  >protos = protos
c010: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
c020: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73  tos_len = protos
c030: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65  _len;.    } else
c040: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72   {..statePtr->pr
c050: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74  otos = NULL;..st
c060: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
c070: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  en = 0;.    }.. 
c080: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
c090: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20   Callbacks.     
c0a0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61  */.    SSL_set_a
c0b0: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72  pp_data(statePtr
c0c0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
c0d0: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69  tatePtr);./* poi
c0e0: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f  nt back to us */
c0f0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72  .    SSL_set_ver
c100: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ify(statePtr->ss
c110: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66  l, verify, Verif
c120: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
c130: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c  SSL_set_info_cal
c140: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c150: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63  ssl, InfoCallbac
c160: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  k);..    /* Call
c170: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69  back for observi
c180: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73  ng protocol mess
c190: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ages */.#ifndef 
c1a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
c1b0: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64  RACE.    /* void
c1c0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
c1d0: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
c1e0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f  atePtr->ctx, (vo
c1f0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c200: 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58      void SSL_CTX
c210: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c220: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  k(statePtr->ctx,
c230: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
c240: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  ); */.    SSL_se
c250: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
c260: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  rg(statePtr->ssl
c270: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c280: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74  tr);.    SSL_set
c290: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74  _msg_callback(st
c2a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73  atePtr->ssl, Mes
c2b0: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23  sageCallback);.#
c2c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72  endif..    /* Cr
c2d0: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  eate Tcl_Channel
c2e0: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a   BIO Handler */.
c2f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f      statePtr->p_
c300: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63  bio.= BIO_new_tc
c310: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f  l(statePtr, BIO_
c320: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74  NOCLOSE);.    st
c330: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49  atePtr->bio.= BI
c340: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28  O_new(BIO_f_ssl(
c350: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72  ));..    if (ser
c360: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65  ver) {../* Serve
c370: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09  r callbacks */..
c380: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
c390: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72  xt_servername_ar
c3a0: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
c3b0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c3c0: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  r);..SSL_CTX_set
c3d0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
c3e0: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  me_callback(stat
c3f0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61  ePtr->ctx, SNICa
c400: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54  llback);..SSL_CT
c410: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c  X_set_client_hel
c420: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  lo_cb(statePtr->
c430: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61  ctx, HelloCallba
c440: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c450: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74  ePtr);..if (stat
c460: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c470: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
c480: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65  _CTX_set_alpn_se
c490: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72  lect_cb(statePtr
c4a0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62  ->ctx, ALPNCallb
c4b0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c4c0: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55  tePtr);.#ifdef U
c4d0: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28  SE_NPN..    if (
c4e0: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c4f0: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09  ls1_3 == 0) {...
c500: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
c510: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73  _protos_advertis
c520: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ed_cb(statePtr->
c530: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b  ctx, NPNCallback
c540: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c550: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64  tr);..    }.#end
c560: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c  if..}.../* Enabl
c570: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64  e server to send
c580: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66   cert request af
c590: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54  ter handshake (T
c5a0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a  LS 1.3 only) */.
c5b0: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72  ./* A write oper
c5c0: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20  ation must take 
c5d0: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65  place for the Ce
c5e0: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73  rtificate Reques
c5f0: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74  t to be..   sent
c600: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20   to the client, 
c610: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65  this can be done
c620: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e   with SSL_do_han
c630: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66  dshake(). */..if
c640: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
c650: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74  t_handshake && t
c660: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53  ls1_3) {..    SS
c670: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f  L_verify_client_
c680: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73  post_handshake(s
c690: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
c6a0: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d  }.../* set autom
c6b0: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63  atic curve selec
c6c0: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74  tion */..SSL_set
c6d0: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65  _ecdh_auto(state
c6e0: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09  Ptr->ssl, 1);...
c6f0: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f  /* Set server mo
c700: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  de */..statePtr-
c710: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
c720: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73  L_SERVER;..SSL_s
c730: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28  et_accept_state(
c740: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
c750: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
c760: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b   Client callback
c770: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  s */.#ifdef USE_
c780: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74  NPN..if (statePt
c790: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
c7a0: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30  L && tls1_2 == 0
c7b0: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
c7c0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
c7d0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73  set_next_proto_s
c7e0: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74  elect_cb(statePt
c7f0: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c  r->ctx, ALPNCall
c800: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
c810: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64  atePtr);..}.#end
c820: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  if.../* Session 
c830: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f  caching */..SSL_
c840: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f  CTX_set_session_
c850: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65  cache_mode(state
c860: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45  Ptr->ctx, SSL_SE
c870: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20  SS_CACHE_CLIENT 
c880: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  | SSL_SESS_CACHE
c890: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f  _NO_INTERNAL_STO
c8a0: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  RE);..SSL_CTX_se
c8b0: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74  ss_set_new_cb(st
c8c0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73  atePtr->ctx, Ses
c8d0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  sionCallback);..
c8e0: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20  ./* Enable post 
c8f0: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e  handshake Authen
c900: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69  tication extensi
c910: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  on. TLS 1.3 only
c920: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f  , not http/2. */
c930: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
c940: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
c950: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f   {..    SSL_set_
c960: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61  post_handshake_a
c970: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uth(statePtr->ss
c980: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  l, 1);..}.../* S
c990: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a  et client mode *
c9a0: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65  /..SSL_set_conne
c9b0: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  ct_state(statePt
c9c0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
c9d0: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73     SSL_set_bio(s
c9e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74  tatePtr->ssl, st
c9f0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73  atePtr->p_bio, s
ca00: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b  tatePtr->p_bio);
ca10: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c  .    BIO_set_ssl
ca20: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
ca30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42  statePtr->ssl, B
ca40: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20  IO_NOCLOSE);..  
ca50: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20    /*.     * End 
ca60: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20  of SSL Init.    
ca70: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28   */.    dprintf(
ca80: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20  "Returning %s", 
ca90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
caa0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
cab0: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  f));.    Tcl_Set
cac0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
cad0: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68  char *)Tcl_GetCh
cae0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
caf0: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56  tr->self), TCL_V
cb00: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65  OLATILE);.    re
cb10: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
cb20: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
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 0a 20 2a 0a 20 2a 20  ---------. *. * 
cb70: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
cb80: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
cb90: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
cba0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
cbb0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
cbc0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
cbd0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
cbe0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
cbf0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
cc00: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
cc10: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
cc20: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
cc30: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
cc40: 2d 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 0a 20 2a 2f 0a 0a  ----------. */..
cc80: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70  static int.Unimp
cc90: 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  ortObjCmd(.    T
cca0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
ccb0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
ccc0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p *interp,.    i
ccd0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c  nt objc,.    Tcl
cce0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
ccf0: 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []).{.    Tcl_Ch
cd00: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
cd10: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
cd20: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
cd30: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
cd40: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
cd50: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
cd60: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
cd70: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
cd80: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
cd90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cda0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
cdb0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
cdc0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
cdd0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
cde0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
cdf0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
ce00: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
ce10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ce20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ce30: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
ce40: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
ce50: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
ce60: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
ce70: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
ce80: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  );..    if (Tcl_
ce90: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
cea0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
ceb0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
cec0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ced0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
cee0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
cef0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
cf00: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
cf10: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
cf20: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63  har *)NULL);..Tc
cf30: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
cf40: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
cf50: 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  NIMPORT", "CHANN
cf60: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
cf70: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
cf80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cf90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
cfa0: 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e  (Tcl_UnstackChan
cfb0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
cfc0: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20  ) == TCL_ERROR) 
cfd0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
cfe0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
cff0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
d000: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
d010: 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
d050: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f  * CTX_Init -- co
d060: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54  nstruct a SSL_CT
d070: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a  X instance. *. *
d080: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76   Results:. *.A v
d090: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73  alid SSL_CTX ins
d0a0: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20  tance or NULL.. 
d0b0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
d0c0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
d0d0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
d0e0: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
d0f0: 2d 2d 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 0a 20 2a 2f 0a  -----------. */.
d130: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
d140: 2a 0a 43 54 58 5f 49 6e 69 74 28 0a 20 20 20 20  *.CTX_Init(.    
d150: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
d160: 0a 20 20 20 20 69 6e 74 20 69 73 53 65 72 76 65  .    int isServe
d170: 72 2c 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f  r,.    int proto
d180: 2c 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66  ,.    char *keyf
d190: 69 6c 65 2c 0a 20 20 20 20 63 68 61 72 20 2a 63  ile,.    char *c
d1a0: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73  ertfile,.    uns
d1b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c  igned char *key,
d1c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
d1d0: 61 72 20 2a 63 65 72 74 2c 0a 20 20 20 20 69 6e  ar *cert,.    in
d1e0: 74 20 6b 65 79 5f 6c 65 6e 2c 0a 20 20 20 20 69  t key_len,.    i
d1f0: 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 0a 20 20 20  nt cert_len,.   
d200: 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20   char *CApath,. 
d210: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c     char *CAfile,
d220: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65  .    char *ciphe
d230: 72 73 2c 0a 20 20 20 20 63 68 61 72 20 2a 63 69  rs,.    char *ci
d240: 70 68 65 72 73 75 69 74 65 73 2c 0a 20 20 20 20  phersuites,.    
d250: 69 6e 74 20 6c 65 76 65 6c 2c 0a 20 20 20 20 63  int level,.    c
d260: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 0a 7b  har *DHparams).{
d270: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
d280: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50  *interp = stateP
d290: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
d2a0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  SSL_CTX *ctx = N
d2b0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
d2c0: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74  ring ds;.    int
d2d0: 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20   off = 0, abort 
d2e0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61  = 0;.    int loa
d2f0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20  d_private_key;. 
d300: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54     const SSL_MET
d310: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20  HOD *method;..  
d320: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
d330: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70  d");..    if (!p
d340: 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70  roto) {..Tcl_App
d350: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d360: 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74  , "no valid prot
d370: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20  ocol selected", 
d380: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
d390: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d3a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74   }..    /* creat
d3b0: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
d3c0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
d3d0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
d3e0: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
d3f0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
d400: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d410: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69  L_NO_SSL2).    i
d420: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d430: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
d440: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d450: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d460: 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL2 protocol no
d470: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d480: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
d490: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d4a0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d4b0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20  ned(NO_SSL3) || 
d4c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d4d0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20  NO_SSL3).    if 
d4e0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
d4f0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29  TLS_PROTO_SSL3))
d500: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
d520: 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L3 protocol not 
d530: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
d540: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
d550: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d560: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d570: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
d580: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d590: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
d5a0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d5b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
d5c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
d5e0: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.0 protocol not
d5f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
d600: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
d610: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d620: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
d630: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
d640: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
d650: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
d660: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d670: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
d680: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_1)) {..Tcl_App
d690: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d6a0: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f  , "TLS 1.1 proto
d6b0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d6c0: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
d6d0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d6e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d6f0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d700: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
d710: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d720: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
d730: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d740: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09  OTO_TLS1_2)) {..
d750: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d760: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
d770: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
d780: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
d790: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72   *)NULL);..retur
d7a0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d7b0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d7c0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
d7d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d7e0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
d7f0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d800: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d810: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  3)) {..Tcl_Appen
d820: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d830: 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f  "TLS 1.3 protoco
d840: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d850: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
d860: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d870: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d880: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20  if (proto == 0) 
d890: 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72  {../* Use full r
d8a0: 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  ange */..SSL_CTX
d8b0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
d8c0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a  ersion(ctx, 0);.
d8d0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
d8e0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
d8f0: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  tx, 0);.    }.. 
d900: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f     switch (proto
d910: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  ) {.#if OPENSSL_
d920: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
d930: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
d940: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
d950: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d960: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
d970: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d980: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20  O_SSL2:..method 
d990: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c  = isServer ? SSL
d9a0: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v2_server_method
d9b0: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e  () : SSLv2_clien
d9c0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
d9d0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
d9e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d9f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
da00: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
da10: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
da20: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
da30: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
da40: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68  ROTO_SSL3:..meth
da50: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
da60: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74  SSLv3_server_met
da70: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c  hod() : SSLv3_cl
da80: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
da90: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
daa0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
dab0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
dac0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
dad0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
dae0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
daf0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
db00: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d  S_PROTO_TLS1:..m
db10: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
db20: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f   ? TLSv1_server_
db30: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
db40: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
db50: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
db60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
db70: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
db80: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
db90: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
dba0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
dbb0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_1_METHOD).  
dbc0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
dbd0: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64  _TLS1_1:..method
dbe0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
dbf0: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_1_server_met
dc00: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f  hod() : TLSv1_1_
dc10: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
dc20: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
dc30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
dc40: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
dc50: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
dc60: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
dc70: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
dc80: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
dc90: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
dca0: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_2:..method 
dcb0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
dcc0: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68  v1_2_server_meth
dcd0: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63  od() : TLSv1_2_c
dce0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
dcf0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
dd00: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dd10: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
dd20: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
dd30: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54  S1_3).    case T
dd40: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a  LS_PROTO_TLS1_3:
dd50: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e  ../* Use the gen
dd60: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20  eric method and 
dd70: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65  constraint range
dd80: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69   after context i
dd90: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65  s created */..me
dda0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
ddb0: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
ddc0: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
ddd0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
dde0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
ddf0: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67  default:../* Neg
de00: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61  otiate highest a
de10: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53  vailable SSL/TLS
de20: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74   version */..met
de30: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
de40: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68   TLS_server_meth
de50: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e  od() : TLS_clien
de60: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20  t_method();.#if 
de70: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
de80: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
de90: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
dea0: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
deb0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dec0: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL2)..off |= (
ded0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
dee0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20  LS_PROTO_SSL2)  
def0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
df00: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv2);.#endif.
df10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
df20: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
df30: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
df40: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  3)..off |= (ENAB
df50: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
df60: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30  ROTO_SSL3)   ? 0
df70: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
df80: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v3);.#endif.#if 
df90: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
dfa0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dfb0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09  ENSSL_NO_TLS1)..
dfc0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
dfd0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
dfe0: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53  _TLS1)   ? 0 : S
dff0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b  SL_OP_NO_TLSv1);
e000: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e010: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
e020: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e030: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09  SSL_NO_TLS1_1)..
e040: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
e050: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
e060: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53  _TLS1_1) ? 0 : S
e070: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31  SL_OP_NO_TLSv1_1
e080: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
e090: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
e0a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e0b0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
e0c0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
e0d0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
e0e0: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a  TO_TLS1_2) ? 0 :
e0f0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
e100: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _2);.#endif.#if 
e110: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
e120: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
e130: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e140: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  3)..off |= (ENAB
e150: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e160: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30  ROTO_TLS1_3) ? 0
e170: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
e180: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62  v1_3);.#endif..b
e190: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
e1a0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
e1b0: 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53  ();..    ctx = S
e1c0: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
e1d0: 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78  d);.    if (!ctx
e1e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
e1f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
e200: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f  (getenv(SSLKEYLO
e210: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43  GFILE)) {..SSL_C
e220: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61  TX_set_keylog_ca
e230: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c  llback(ctx, KeyL
e240: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ogCallback);.   
e250: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
e260: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
e270: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e280: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
e290: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f  f (proto == TLS_
e2a0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a  PROTO_TLS1_3) {.
e2b0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e  .SSL_CTX_set_min
e2c0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
e2d0: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
e2e0: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  ON);..SSL_CTX_se
e2f0: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73  t_max_proto_vers
e300: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
e310: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a  VERSION);.    }.
e320: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46  #endif..    /* F
e330: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65  orce cipher sele
e340: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73  ction order by s
e350: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  erver */.    if 
e360: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53  (!isServer) {..S
e370: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
e380: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43  ns(ctx, SSL_OP_C
e390: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45  IPHER_SERVER_PRE
e3a0: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a  FERENCE);.    }.
e3b0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
e3c0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
e3d0: 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70  10100000L.    Op
e3e0: 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c  enSSL_add_all_al
e3f0: 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c  gorithms(); /* L
e400: 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20  oad ciphers and 
e410: 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69  digests */.#endi
e420: 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  f..    SSL_CTX_s
e430: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c  et_app_data(ctx,
e440: 20 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d   interp);./* rem
e450: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
e460: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
e470: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e480: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
e490: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
e4a0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
e4b0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e4c0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
e4d0: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53  L_OP_NO_COMPRESS
e4e0: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65  ION);./* disable
e4f0: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65   compression eve
e500: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a  n if supported *
e510: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
e520: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f  t_options(ctx, o
e530: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65  ff);../* disable
e540: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
e550: 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ns */.#if OPENSS
e560: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
e570: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20   < 0x10101000L. 
e580: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
e590: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
e5a0: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f  E_AUTO_RETRY);./
e5b0: 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e  * handle new han
e5c0: 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67  dshakes in backg
e5d0: 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66  round. On by def
e5e0: 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20  ault in OpenSSL 
e5f0: 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66  1.1.1. */.#endif
e600: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
e610: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
e620: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
e630: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
e640: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
e650: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
e660: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
e670: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
e680: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
e690: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
e6a0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
e6b0: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41  phers)) {..Tcl_A
e6c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e6d0: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73  rp, "Set ciphers
e6e0: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
e6f0: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
e700: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  r *)NULL);..SSL_
e710: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e720: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e730: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
e740: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
e750: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e760: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
e770: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
e780: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
e790: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e7a0: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
e7b0: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
e7c0: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
e7d0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c  ar *)NULL);..SSL
e7e0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e7f0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
e800: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
e810: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
e820: 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20  /.    if (level 
e830: 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20  > -1 && level < 
e840: 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  6) {../* SSL_set
e850: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20  _security_level 
e860: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
e870: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63  security_level(c
e880: 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20  tx, level);.    
e890: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f  }..    /* set so
e8a0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  me callbacks */.
e8b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e8c0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
e8d0: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43  b(ctx, PasswordC
e8e0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
e8f0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e900: 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72  t_passwd_cb_user
e910: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20  data(ctx, (void 
e920: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  *)statePtr);..  
e930: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66    /* read a Diff
e940: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d  ie-Hellman param
e950: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75  eters file, or u
e960: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  se the built-in 
e970: 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  one */.    Tcl_D
e980: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
e990: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f  .#ifdef OPENSSL_
e9a0: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48  NO_DH.    if (DH
e9b0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
e9c0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e9d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20  ult(interp, "DH 
e9e0: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72  parameter suppor
e9f0: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22  t not available"
ea00: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
ea10: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
ea20: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
ea30: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  L;.    }.#else. 
ea40: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69     {..DH* dh;..i
ea50: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
ea60: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20  ULL) {..    BIO 
ea70: 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20  *bio;...    bio 
ea80: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
ea90: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
eaa0: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
eab0: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
eac0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ead0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
eae0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
eaf0: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20  uld not find DH 
eb00: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22  parameters file"
eb10: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
eb20: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
eb30: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
eb40: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ULL;..    }...  
eb50: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f    dh = PEM_read_
eb60: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f  bio_DHparams(bio
eb70: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
eb80: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72  LL);..    BIO_fr
eb90: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63  ee(bio);..    Tc
eba0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
ebb0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68  s);..    if (!dh
ebc0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
ebd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ebe0: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44  Could not read D
ebf0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f  H parameters fro
ec00: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  m file", (char *
ec10: 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54  )NULL);...SSL_CT
ec20: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
ec30: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
ec40: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   }..    SSL_CTX_
ec50: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20  set_tmp_dh(ctx, 
ec60: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65  dh);..    DH_fre
ec70: 65 28 64 68 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  e(dh);..} else {
ec80: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c  ..    /* Use wel
ec90: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d  l known DH param
eca0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  eters that have 
ecb0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74  built-in support
ecc0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09   in OpenSSL */..
ecd0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
ece0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78  _set_dh_auto(ctx
ecf0: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70  , 1)) {...Tcl_Ap
ed00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ed10: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e  p, "Could not en
ed20: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f  able set DH auto
ed30: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
ed40: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
ed50: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
ed60: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
ed70: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
ed80: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ..}.    }.#endif
ed90: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
eda0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
edb0: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65      load_private
edc0: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  _key = 0;.    if
edd0: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55   (certfile != NU
ede0: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
edf0: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69  ate_key = 1;...i
ee00: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
ee10: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
ee20: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c  ctx, F2N(certfil
ee30: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c  e, &ds), SSL_FIL
ee40: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
ee50: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
ee60: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
ee70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ee80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
ee90: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
eea0: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
eeb0: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
eec0: 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41  .    GET_ERR_REA
eed0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
eee0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
eef0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
ef00: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
ef10: 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  .}..Tcl_DStringF
ef20: 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d  ree(&ds);..    }
ef30: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21   else if (cert !
ef40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
ef50: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
ef60: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
ef70: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53  e_certificate_AS
ef80: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e  N1(ctx, cert_len
ef90: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a  , cert) <= 0) {.
efa0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
efb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
efc0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
efd0: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 20  tificate: ",... 
efe0: 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f     GET_ERR_REASO
eff0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
f000: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
f010: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
f020: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
f030: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63  .    } else {..c
f040: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a  ertfile = (char*
f050: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c  )X509_get_defaul
f060: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a  t_cert_file();..
f070: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
f080: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
f090: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c  e(ctx, certfile,
f0a0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
f0b0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30  M) <= 0) {.#if 0
f0c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
f0d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f0e0: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65  unable to use de
f0f0: 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74  fault certificat
f100: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
f110: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20  le, ": ",...    
f120: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
f130: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
f140: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
f150: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
f160: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  turn NULL;.#endi
f170: 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  f..}.    }..    
f180: 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61  /* set our priva
f190: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66  te key */.    if
f1a0: 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b   (load_private_k
f1b0: 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69  ey) {..if (keyfi
f1c0: 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65  le == NULL && ke
f1d0: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  y == NULL) {..  
f1e0: 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74    keyfile = cert
f1f0: 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b  file;..}...if (k
f200: 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  eyfile != NULL) 
f210: 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68  {..    /* get th
f220: 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73  e private key as
f230: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
f240: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  is certificate *
f250: 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69  /..    if (keyfi
f260: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
f270: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
f280: 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  le;..    }...   
f290: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
f2a0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65  _PrivateKey_file
f2b0: 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c  (ctx, F2N(keyfil
f2c0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c  e, &ds), SSL_FIL
f2d0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
f2e0: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
f2f0: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20  Free(&ds);.../* 
f300: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
f310: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
f320: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
f330: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f  result */...Tcl_
f340: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f350: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54  , NULL, TCL_STAT
f360: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  IC);...Tcl_Appen
f370: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f380: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70  "unable to set p
f390: 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22  ublic key file "
f3a0: 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a  , keyfile, " ",.
f3b0: 09 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
f3c0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
f3d0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f3e0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f3f0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
f400: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f410: 72 65 65 28 26 64 73 29 3b 0a 09 7d 20 65 6c 73  ree(&ds);..} els
f420: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
f430: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
f440: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
f450: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
f460: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
f470: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20  ,key_len) <= 0) 
f480: 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  {.../* flush the
f490: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
f4a0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
f4b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
f4c0: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
f4d0: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
f4e0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
f4f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f500: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
f510: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
f520: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
f530: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
f540: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
f550: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
f560: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
f570: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b  ..}../* Now we k
f580: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61  now that a key a
f590: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65  nd cert have bee
f5a0: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20  n set against.. 
f5b0: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78  * the SSL contex
f5c0: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43  t */..if (!SSL_C
f5d0: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65  TX_check_private
f5e0: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20  _key(ctx)) {..  
f5f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f600: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76  lt(interp, "priv
f610: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ate key does not
f620: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69   match the certi
f630: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65  ficate public ke
f640: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61  y",....     (cha
f650: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
f660: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f670: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f680: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
f690: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65     /* Set to use
f6a0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
f6b0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
f6c0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
f6d0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
f6e0: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20  icates. The.    
f6f0: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61   * verify path a
f700: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20  nd store can be 
f710: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
f720: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65  e SSL_CERT_DIR e
f730: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69  nv var. The veri
f740: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20  fy file can.    
f750: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e   * be overridden
f760: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
f770: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a  _FILE env var. *
f780: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
f790: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
f7a0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29  erify_paths(ctx)
f7b0: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20  ) {..abort++;.  
f7c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
f7d0: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41  rides for the CA
f7e0: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64   verify path and
f7f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23   file */.    {.#
f800: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
f810: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
f820: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70  000000L..if (CAp
f830: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43  ath != NULL || C
f840: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
f850: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f860: 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f  g ds1;..    Tcl_
f870: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31  DStringInit(&ds1
f880: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53  );...    if (!SS
f890: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
f8a0: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c  y_locations(ctx,
f8b0: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73   F2N(CAfile, &ds
f8c0: 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26  ), F2N(CApath, &
f8d0: 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74  ds1))) {...abort
f8e0: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ++;..    }..    
f8f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f900: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  &ds);..    Tcl_D
f910: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
f920: 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
f930: 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
f940: 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
f950: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
f960: 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
f970: 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74  e */..    /* htt
f980: 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65  ps://sourceforge
f990: 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f  .net/p/tls/bugs/
f9a0: 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58  57/ */..    /* X
f9b0: 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65  XX:TODO: Let the
f9c0: 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c   user supply val
f9d0: 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64  ues here instead
f9e0: 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   of something th
f9f0: 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  at exists on the
fa00: 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09   filesystem */..
fa10: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
fa20: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
fa30: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
fa40: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
fa50: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
fa60: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
fa70: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
fa80: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
fa90: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
faa0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
fab0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
fac0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
fad0: 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70  ..#else..if (CAp
fae0: 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ath != NULL) {..
faf0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
fb00: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72  _load_verify_dir
fb10: 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68  (ctx, F2N(CApath
fb20: 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f  , &ds))) {...abo
fb30: 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rt++;..    }..  
fb40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
fb50: 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28  e(&ds);..}..if (
fb60: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
fb70: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  {..    if (!SSL_
fb80: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
fb90: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41  file(ctx, F2N(CA
fba0: 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09  file, &ds))) {..
fbb0: 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d  .abort++;..    }
fbc0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
fbd0: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20  gFree(&ds);...  
fbe0: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66    /* Set list of
fbf0: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20   CAs to send to 
fc00: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75  client when requ
fc10: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20  esting a client 
fc20: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
fc30: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
fc40: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
fc50: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
fc60: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
fc70: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
fc80: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
fc90: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
fca0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
fcb0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
fcc0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
fcd0: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
fce0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
fcf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
fd00: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d     return ctx;.}
fd10: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
fd20: 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
fd60: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d  * StatusObjCmd -
fd70: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69  - return certifi
fd80: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74  cate for connect
fd90: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52  ed peer.. *. * R
fda0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
fdb0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
fdc0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
fdd0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
fde0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
fe30: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a  ic int.StatusObj
fe40: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
fe50: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
fe60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
fe70: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp,.    int obj
fe80: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a  c,.    Tcl_Obj.*
fe90: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a  const objv[]).{.
fea0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
feb0: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70  Ptr;.    X509 *p
fec0: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  eer;.    Tcl_Obj
fed0: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63   *objPtr;.    Tc
fee0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
fef0: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65      char *channe
ff00: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b  lName, *ciphers;
ff10: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20  .    int mode;. 
ff20: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
ff30: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20  d char *proto;. 
ff40: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
ff50: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64  len;.    int nid
ff60: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69  , res;..    dpri
ff70: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
ff80: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
ff90: 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20   || objc > 3 || 
ffa0: 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73  (objc == 3 && !s
ffb0: 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
ffc0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d  ing(objv[1]), "-
ffd0: 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c  local"))) {..Tcl
ffe0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
fff0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
10000 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c  ?-local? channel
10010 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
10020 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
10030 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c    /* Get channel
10040 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e   Id */.    chann
10050 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  elName = Tcl_Get
10060 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a  String(objv[(obj
10070 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d  c == 2 ? 1 : 2)]
10080 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  );.    chan = Tc
10090 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
100a0 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  erp, channelName
100b0 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66  , &mode);.    if
100c0 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
100d0 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
100e0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
100f0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
10100 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
10110 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
10120 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
10130 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10140 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
10150 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
10160 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
10170 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
10180 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
10190 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
101a0 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
101b0 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
101c0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
101d0 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
101e0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
101f0 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63  har *)NULL);..Tc
10200 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
10210 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53  nterp, "TLS", "S
10220 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c  TATUS", "CHANNEL
10230 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
10240 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
10250 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10260 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
10270 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54  tr = (State *) T
10280 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
10290 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
102a0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72  ..    /* Get cer
102b0 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65  tificate for pee
102c0 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20  r or self */.   
102d0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
102e0 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
102f0 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61  t_peer_certifica
10300 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
10310 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
10320 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
10330 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
10340 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
10350 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30  }.    /* Get X50
10360 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
10370 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65  fo */.    if (pe
10380 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
10390 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
103a0 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
103b0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
103c0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70  .    X509_free(p
103d0 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20  eer);..    peer 
103e0 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  = NULL;..}.    }
103f0 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
10400 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
10410 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
10420 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
10430 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
10440 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10450 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22  jPtr, "peername"
10460 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e  , SSL_get0_peern
10470 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
10480 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  l), -1);.    LAP
10490 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
104a0 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22   objPtr, "sbits"
104b0 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  , SSL_get_cipher
104c0 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
104d0 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20  ssl, NULL));..  
104e0 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
104f0 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
10500 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
10510 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
10520 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10530 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68  , "cipher", ciph
10540 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  ers, -1);..    /
10550 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30  * Verify the X50
10560 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72  9 certificate pr
10570 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70  esented by the p
10580 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  eer */.    LAPPE
10590 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
105a0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65  bjPtr, "verifyRe
105b0 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72  sult",..X509_ver
105c0 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
105d0 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
105e0 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
105f0 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
10600 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
10610 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64   mode */.    mod
10620 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  e = SSL_get_veri
10630 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  fy_mode(statePtr
10640 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  ->ssl);.    if (
10650 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
10660 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50  FY_NONE) {..LAPP
10670 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10680 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
10690 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ode", "none", -1
106a0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
106b0 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62  .Tcl_Obj *listOb
106c0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
106d0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
106e0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
106f0 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a  _VERIFY_PEER) {.
10700 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10710 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10720 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10730 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10740 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b  bj("peer", -1));
10750 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
10760 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
10770 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
10780 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
10790 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
107a0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
107b0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
107c0 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20  ingObj("fail if 
107d0 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d  no peer cert", -
107e0 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
107f0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10800 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09  CLIENT_ONCE) {..
10810 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10820 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10830 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10840 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
10850 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c  j("client once",
10860 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
10870 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
10880 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
10890 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
108a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
108b0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
108c0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
108d0 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e  ingObj("post han
108e0 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09  dshake", -1));..
108f0 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
10900 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10910 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73  verifyMode", lis
10920 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a  tObjPtr).    }..
10930 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
10940 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20  de depth */.    
10950 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10960 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
10970 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67  ifyDepth", SSL_g
10980 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28  et_verify_depth(
10990 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b  statePtr->ssl));
109a0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
109b0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
109c0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
109d0 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
109e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
109f0 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
10a00 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
10a10 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
10a20 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10a30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10a40 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
10a50 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a  )proto, (Tcl_Siz
10a60 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  e) len);.    LAP
10a70 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10a80 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
10a90 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  ol", SSL_get_ver
10aa0 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
10ab0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  sl), -1);..    /
10ac0 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d  * Valid for non-
10ad0 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e  RSA signature an
10ae0 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  d TLS 1.3 */.   
10af0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
10b00 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
10b10 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
10b20 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
10b30 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
10b40 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
10b50 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
10b60 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
10b70 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a  l, &nid);.    }.
10b80 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e      if (!res) {n
10b90 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50  id = 0;}.    LAP
10ba0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10bb0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74   objPtr, "signat
10bc0 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
10bd0 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69  ", OBJ_nid2ln(ni
10be0 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66  d), -1);..    if
10bf0 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10c00 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
10c10 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
10c20 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
10c30 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
10c40 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
10c50 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
10c60 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
10c70 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
10c80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
10c90 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a  res) {nid = 0;}.
10ca0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
10cb0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10cc0 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c  "signatureType",
10cd0 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29   OBJ_nid2ln(nid)
10ce0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  , -1);..    Tcl_
10cf0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10d00 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
10d10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10d20 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
10d30 2d 2d 2d 2d 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 0a 20 2a  -------------. *
10d70 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  . * ConnectionIn
10d80 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  foObjCmd -- retu
10d90 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  rn connection in
10da0 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  fo from OpenSSL.
10db0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
10dc0 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e   *.A list of con
10dd0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a  nection info.  *
10de0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
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 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
10e30 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f  ic int Connectio
10e40 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a 20 20 20  nInfoObjCmd(.   
10e50 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
10e60 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
10e70 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20  erp *interp,.   
10e80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54   int objc,.    T
10e90 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
10ea0 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  jv[]).{.    Tcl_
10eb0 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
10ec0 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
10ed0 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a   set a mode on *
10ee0 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
10ef0 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
10f00 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
10f10 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
10f20 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
10f30 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
10f40 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
10f50 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
10f60 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
10f70 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
10f80 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
10f90 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b  onst EVP_MD *md;
10fa0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
10fb0 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
10fc0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10fd0 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
10fe0 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
10ff0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
11000 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
11010 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
11020 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
11030 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
11040 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
11050 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
11060 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
11070 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11080 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
11090 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
110a0 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
110b0 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
110c0 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
110d0 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
110e0 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
110f0 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
11100 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
11110 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
11120 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
11130 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
11140 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
11150 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22  me(chan),..    "
11160 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
11170 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
11180 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
11190 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
111a0 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54   "TLS", "CONNECT
111b0 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ION", "CHANNEL",
111c0 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
111d0 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
111e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
111f0 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20    }..    objPtr 
11200 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
11210 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  (0, NULL);..    
11220 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  /* Connection in
11230 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  fo */.    stateP
11240 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
11250 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
11260 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
11270 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50      ssl = stateP
11280 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20  tr->ssl;.    if 
11290 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl != NULL) {.
112a0 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ./* connection s
112b0 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  tate */..LAPPEND
112c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
112d0 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53  Ptr, "state", SS
112e0 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c  L_state_string_l
112f0 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  ong(ssl), -1);..
11300 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75  ./* Get SNI requ
11310 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d  ested server nam
11320 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  e */..LAPPEND_ST
11330 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11340 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20  , "servername", 
11350 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
11360 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
11370 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
11380 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  e), -1);.../* Ge
11390 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c  t protocol */..L
113a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
113b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
113c0 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76  ocol", SSL_get_v
113d0 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29  ersion(ssl), -1)
113e0 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61  ;.../* Renegotia
113f0 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  tion allowed */.
11400 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
11410 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
11420 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c  enegotiation_all
11430 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73  owed", SSL_get_s
11440 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74  ecure_renegotiat
11450 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c  ion_support((SSL
11460 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20   *) ssl));.../* 
11470 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76  Get security lev
11480 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49  el */..LAPPEND_I
11490 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
114a0 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76  r, "security_lev
114b0 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63  el", SSL_get_sec
114c0 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29  urity_level(ssl)
114d0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
114e0 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  info */..LAPPEND
114f0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
11500 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72  jPtr, "session_r
11510 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73  eused", SSL_sess
11520 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29  ion_reused(ssl))
11530 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72  ;.../* Is server
11540 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
11550 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11560 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65  bjPtr, "is_serve
11570 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65  r", SSL_is_serve
11580 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  r(ssl));.../* Is
11590 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e   DTLS */..LAPPEN
115a0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
115b0 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22  bjPtr, "is_dtls"
115c0 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73  , SSL_is_dtls(ss
115d0 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  l));.    }..    
115e0 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a  /* Cipher info *
115f0 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53  /.    cipher = S
11600 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
11610 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20  ipher(ssl);.    
11620 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55  if (cipher != NU
11630 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b  LL) {..char buf[
11640 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09  BUFSIZ] = {0};..
11650 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69  int bits, alg_bi
11660 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  ts;.../* Cipher 
11670 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
11680 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11690 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53  Ptr, "cipher", S
116a0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
116b0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
116c0 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f  .../* RFC name o
116d0 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
116e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
116f0 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61   objPtr, "standa
11700 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49  rd_name", SSL_CI
11710 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
11720 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
11730 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61  .../* OpenSSL na
11740 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
11750 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11760 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70  erp, objPtr, "op
11770 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45  enssl_name", OPE
11780 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65  NSSL_cipher_name
11790 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e  (SSL_CIPHER_stan
117a0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
117b0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75  )), -1);.../* nu
117c0 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62  mber of secret b
117d0 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70  its used for cip
117e0 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53  her */..bits = S
117f0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
11800 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
11810 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
11820 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
11830 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73  tr, "secret_bits
11840 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  ", bits);..LAPPE
11850 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11860 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68  bjPtr, "algorith
11870 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74  m_bits", alg_bit
11880 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  s);../* alg_bits
11890 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
118a0 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
118b0 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
118c0 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
118d0 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20  its differ,..   
118e0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
118f0 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
11900 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
11910 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
11920 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a  (bits < 56) */..
11930 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68  ./* Indicates wh
11940 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74  ich SSL/TLS prot
11950 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72  ocol version fir
11960 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63  st defined the c
11970 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
11980 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11990 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69  jPtr, "min_versi
119a0 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  on", SSL_CIPHER_
119b0 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
119c0 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43  er), -1);.../* C
119d0 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41  ipher NID */..LA
119e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
119f0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11a00 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  rNID", (char *)O
11a10 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
11a20 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f  PHER_get_cipher_
11a30 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11a40 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11a50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11a60 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68  "digestNID", (ch
11a70 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
11a80 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64  SSL_CIPHER_get_d
11a90 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72  igest_nid(cipher
11aa0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
11ab0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11ac0 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e  jPtr, "keyExchan
11ad0 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  geNID", (char *)
11ae0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
11af0 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64  IPHER_get_kx_nid
11b00 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
11b10 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11b20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75  erp, objPtr, "au
11b30 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22  thenticationNID"
11b40 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11b50 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11b60 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70  get_auth_nid(cip
11b70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
11b80 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
11b90 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43  ication code - C
11ba0 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65  ipher is AEAD (e
11bb0 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68  .g. GCM or ChaCh
11bc0 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72  a20/Poly1305) or
11bd0 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68   not */../* Auth
11be0 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70  enticated Encryp
11bf0 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69  tion with associ
11c00 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29  ated data (AEAD)
11c10 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45   check */..LAPPE
11c20 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11c30 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
11c40 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49  is_aead", SSL_CI
11c50 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70  PHER_is_aead(cip
11c60 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65  her));.../* Dige
11c70 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  st used during t
11c80 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73  he SSL/TLS hands
11c90 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20  hake when using 
11ca0 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09  the cipher. */..
11cb0 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  md = SSL_CIPHER_
11cc0 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69  get_handshake_di
11cd0 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c  gest(cipher);..L
11ce0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11cf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64  p, objPtr, "hand
11d00 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28  shake_digest", (
11d10 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61  char *)EVP_MD_na
11d20 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f  me(md), -1);.../
11d30 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70  * Get OpenSSL-sp
11d40 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49  ecific ID, not I
11d50 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45  ANA ID */..LAPPE
11d60 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11d70 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
11d80 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
11d90 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
11da0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62  er));.../* Two-b
11db0 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74  yte ID used in t
11dc0 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  he TLS protocol 
11dd0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70  of the given cip
11de0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
11df0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
11e00 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64  tr, "protocol_id
11e10 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
11e20 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c  HER_get_protocol
11e30 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
11e40 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72  /* Textual descr
11e50 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
11e60 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c  pher */..if (SSL
11e70 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
11e80 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
11e90 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
11ea0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
11eb0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11ec0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
11ed0 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
11ee0 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
11ef0 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
11f00 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
11f10 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
11f20 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
11f30 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
11f40 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
11f50 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
11f60 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
11f70 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
11f80 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
11f90 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
11fa0 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e  _id, *proto;..un
11fb0 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66  signed char buff
11fc0 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  er[SSL_MAX_MASTE
11fd0 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a  R_KEY_LENGTH];..
11fe0 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
11ff0 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
12000 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
12010 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61  the ALPN negotia
12020 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  tion */..SSL_SES
12030 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  SION_get0_alpn_s
12040 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c  elected(session,
12050 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b   &proto, &len2);
12060 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
12070 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
12080 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70  lpn", (char *) p
12090 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
120a0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70   len2);.../* Rep
120b0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
120c0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
120d0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e  esult of the NPN
120e0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
120f0 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
12100 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72  SSL_get0_next_pr
12110 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73  oto_negotiated(s
12120 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65  sl, &proto, &ule
12130 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
12140 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12150 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29   "npn", (char *)
12160 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
12170 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66  e) ulen);.#endif
12180 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20  .../* Resumable 
12190 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50  session */..LAPP
121a0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
121b0 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61   objPtr, "resuma
121c0 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ble", SSL_SESSIO
121d0 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73  N_is_resumable(s
121e0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
121f0 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
12200 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
12210 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50   epoch) */..LAPP
12220 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
12230 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f   objPtr, "start_
12240 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
12250 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73  ON_get_time(sess
12260 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  ion));.../* Time
12270 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
12280 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
12290 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
122a0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
122b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
122c0 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53  imeout", SSL_SES
122d0 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74  SION_get_timeout
122e0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
122f0 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c   Session id - TL
12300 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20  Sv1.2 and below 
12310 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  only */..session
12320 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
12330 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
12340 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
12350 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
12360 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
12370 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f  on_id", session_
12380 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
12390 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  len);.../* Sessi
123a0 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  on context */..s
123b0 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
123c0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f  SESSION_get0_id_
123d0 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c  context(session,
123e0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
123f0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
12400 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
12410 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73  n_context", sess
12420 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
12430 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
12440 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20  ession ticket - 
12450 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09  client only */..
12460 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
12470 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c  _ticket(session,
12480 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
12490 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
124a0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
124b0 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65  , "session_ticke
124c0 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  t", ticket, (Tcl
124d0 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
124e0 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
124f0 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20  t lifetime hint 
12500 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
12510 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
12520 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c  terp, objPtr, "l
12530 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  ifetime", SSL_SE
12540 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74  SSION_get_ticket
12550 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73  _lifetime_hint(s
12560 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
12570 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a  icket app data *
12580 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
12590 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
125a0 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f  x30000000L..SSL_
125b0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
125c0 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c  ket_appdata((SSL
125d0 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73  _SESSION *) sess
125e0 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
125f0 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
12600 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
12610 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70  jPtr, "ticket_ap
12620 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c  p_data", ticket,
12630 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12640 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47  );.#endif.../* G
12650 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f  et master key */
12660 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53  ..len2 = SSL_SES
12670 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f  SION_get_master_
12680 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66  key(session, buf
12690 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53  fer, SSL_MAX_MAS
126a0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b  TER_KEY_LENGTH);
126b0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
126c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
126d0 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62   "master_key", b
126e0 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65  uffer, (Tcl_Size
126f0 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f  ) len2);.../* Co
12700 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  mpression id */.
12710 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64  .unsigned int id
12720 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12730 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73  et_compress_id(s
12740 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e  ession);..LAPPEN
12750 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12760 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
12770 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20  on_id", id == 1 
12780 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65  ? "zlib" : "none
12790 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ", -1);.    }.. 
127a0 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
127b0 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
127c0 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
127d0 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
127e0 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
127f0 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
12800 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
12810 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
12820 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
12830 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
12840 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
12850 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
12860 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
12870 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
12880 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d  ompression", com
12890 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  p ? SSL_COMP_get
128a0 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e  _name(comp) : "n
128b0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
128c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
128d0 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
128e0 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f  on", expn ? SSL_
128f0 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78  COMP_get_name(ex
12900 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  pn) : "none", -1
12910 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e  );.#else..LAPPEN
12920 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12930 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
12940 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
12950 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
12960 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12970 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e  expansion", "non
12980 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  e", -1);.#endif.
12990 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
129a0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
129b0 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20   {..long mode = 
129c0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73  SSL_CTX_get_sess
129d0 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
129e0 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
129f0 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20  char *msg;...if 
12a00 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
12a10 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20  _CACHE_OFF) {.. 
12a20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a     msg = "off";.
12a30 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
12a40 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12a50 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20  E_CLIENT) {..   
12a60 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b   msg = "client";
12a70 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
12a80 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
12a90 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20  HE_SERVER) {..  
12aa0 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22    msg = "server"
12ab0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12ac0 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12ad0 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20  CHE_BOTH) {..   
12ae0 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09   msg = "both";..
12af0 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73  } else {..    ms
12b00 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09  g = "unknown";..
12b10 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  }..LAPPEND_STR(i
12b20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12b30 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
12b40 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  de", msg, -1);. 
12b50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20     }..    /* CA 
12b60 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  List */.    /* I
12b70 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20  F not a server, 
12b80 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30  same as SSL_get0
12b90 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49  _peer_CA_list. I
12ba0 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73  f server same as
12bb0 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69   SSL_CTX_get_cli
12bc0 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20  ent_CA_list */. 
12bd0 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c     listPtr = Tcl
12be0 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
12bf0 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f  ULL);.    STACK_
12c00 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
12c10 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28  a_list;.    if (
12c20 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67  (ca_list = SSL_g
12c30 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
12c40 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29  t(ssl)) != NULL)
12c50 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b   {..char buffer[
12c60 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69  BUFSIZ];..for (i
12c70 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
12c80 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63  _X509_NAME_num(c
12c90 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a  a_list); i++) {.
12ca0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a  .    X509_NAME *
12cb0 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e  name = sk_X509_N
12cc0 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73  AME_value(ca_lis
12cd0 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28  t, i);..    if (
12ce0 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e  name) {...X509_N
12cf0 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65  AME_oneline(name
12d00 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
12d10 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  );...Tcl_ListObj
12d20 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12d30 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
12d40 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12d50 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20  buffer, -1));.. 
12d60 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20     }..}.    }.  
12d70 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
12d80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
12d90 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29  aList", listPtr)
12da0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  ;.    LAPPEND_IN
12db0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
12dc0 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c  , "caListCount",
12dd0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
12de0 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20  m(ca_list));..  
12df0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
12e00 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
12e10 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
12e20 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f  ---. *. * Versio
12e80 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  nObjCmd -- retur
12e90 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  n version string
12ea0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
12eb0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
12ec0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
12ed0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
12ee0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
12ef0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
12f00 2d 2d 2d 2d 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 0a 20 2a  -------------. *
12f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
12f50 73 69 6f 6e 4f 62 6a 43 6d 64 28 0a 20 20 20 20  sionObjCmd(.    
12f60 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20  TCL_UNUSED(void 
12f70 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  *),.    Tcl_Inte
12f80 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20  rp *interp,.    
12f90 54 43 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 20  TCL_UNUSED(int) 
12fa0 2f 2a 20 6f 62 6a 63 20 2a 2f 2c 0a 20 20 20 20  /* objc */,.    
12fb0 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f  TCL_UNUSED(Tcl_O
12fc0 62 6a 20 2a 63 6f 6e 73 74 20 2a 29 20 2f 2a 20  bj *const *) /* 
12fd0 6f 62 6a 76 20 2a 2f 29 0a 7b 0a 20 20 20 20 54  objv */).{.    T
12fe0 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
12ff0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13000 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a  lled");..    obj
13010 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Ptr = Tcl_NewStr
13020 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56  ingObj(OPENSSL_V
13030 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29  ERSION_TEXT, -1)
13040 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
13050 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
13060 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
13070 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
13080 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
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 0a 20 2a 0a 20 2a 20 4d  --------. *. * M
130d0 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73  iscObjCmd -- mis
130e0 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  c commands. *. *
130f0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
13100 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
13110 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
13120 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
13130 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
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 0a 20 2a 2f 0a 73 74  ---------. */.st
13180 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a  atic int.MiscObj
13190 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
131a0 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
131b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
131c0 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a  erp,.    int obj
131d0 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c,.    Tcl_Obj *
131e0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a  const objv[]).{.
131f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13200 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
13210 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
13220 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
13230 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
13240 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
13250 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
13260 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b     Tcl_Size cmd;
13270 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a  .    int isStr;.
13280 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
13290 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72  16384];..    dpr
132a0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
132b0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
132c0 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
132d0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
132e0 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
132f0 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
13300 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
13320 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
13330 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
13340 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
13350 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64  ommand", 0, &cmd
13360 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13370 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13380 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
13390 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
133a0 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
133b0 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
133c0 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
133d0 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
133e0 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
133f0 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
13400 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
13410 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
13420 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
13430 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
13440 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
13450 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
13460 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  ;..    Tcl_Size 
13470 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42  listc,i;...    B
13480 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09  IO *out=NULL;...
13490 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
134a0 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c  k_C="",*k_ST="",
134b0 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c  *k_L="",*k_O="",
134c0 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22  *k_OU="",*k_CN="
134d0 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09  ",*k_Email="";..
134e0 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74      char *keyout
134f0 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09  ,*pemout,*str;..
13500 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c      int keysize,
13510 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36  serial=0,days=36
13520 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  5;..#if OPENSSL_
13530 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
13540 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
13550 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20    BIGNUM *bne = 
13560 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a  NULL;..    RSA *
13570 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73  rsa = NULL;.#els
13580 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  e..    EVP_PKEY_
13590 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
135a0 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66  .#endif...    if
135b0 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f   ((objc<5) || (o
135c0 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f  bjc>6)) {...Tcl_
135d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
135e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b  erp, 2, objv, "k
135f0 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63  eysize keyfile c
13600 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29  ertfile ?info?")
13610 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
13620 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  RROR;..    }... 
13630 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
13640 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
13650 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69   objv[2], &keysi
13660 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ze) != TCL_OK) {
13670 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13680 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
13690 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53   keyout=Tcl_GetS
136a0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
136b0 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f  .    pemout=Tcl_
136c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34  GetString(objv[4
136d0 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53  ]);..    if (isS
136e0 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56  tr) {...Tcl_SetV
136f0 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74  ar(interp,keyout
13700 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65  ,"",0);...Tcl_Se
13710 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
13720 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d  ut,"",0);..    }
13730 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e  ...    if (objc>
13740 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f  =6) {...if (Tcl_
13750 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
13760 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  ts(interp, objv[
13770 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73  5], &listc, &lis
13780 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tv) != TCL_OK) {
13790 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
137a0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
137b0 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d  if ((listc%2) !=
137c0 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f   0) {...    Tcl_
137d0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
137e0 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69  ,"Information li
137f0 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65  st must have eve
13800 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  n number of argu
13810 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09  ments",NULL);...
13820 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13830 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20  RROR;...}...for 
13840 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69  (i=0; i<listc; i
13850 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72  +=2) {...    str
13860 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
13870 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20  istv[i]);...    
13880 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13890 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09  days")==0) {....
138a0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
138b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73  omObj(interp,lis
138c0 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d  tv[i+1],&days)!=
138d0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
138e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
138f0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13900 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65   (strcmp(str,"se
13910 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  rial")==0) {....
13920 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
13930 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73  omObj(interp,lis
13940 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29  tv[i+1],&serial)
13950 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20  !=TCL_OK)....   
13960 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13970 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  R;...    } else 
13980 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13990 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  C")==0) {....k_C
139a0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
139b0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
139c0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
139d0 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30  cmp(str,"ST")==0
139e0 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f  ) {....k_ST=Tcl_
139f0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13a00 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13a10 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13a20 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"L")==0) {...
13a30 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_L=Tcl_GetStri
13a40 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13a50 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13a60 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29  (strcmp(str,"O")
13a70 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63  ==0) {....k_O=Tc
13a80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13a90 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13aa0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13ab0 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b  (str,"OU")==0) {
13ac0 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74  ....k_OU=Tcl_Get
13ad0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13ae0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13af0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13b00 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "CN")==0) {....k
13b10 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _CN=Tcl_GetStrin
13b20 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13b30 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13b40 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69  strcmp(str,"Emai
13b50 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45  l")==0) {....k_E
13b60 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69  mail=Tcl_GetStri
13b70 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13b80 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
13b90 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
13ba0 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20  interp,"Unknown 
13bb0 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29  parameter",NULL)
13bc0 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  ;....return TCL_
13bd0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09  ERROR;...    }..
13be0 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f  .}..    }..#if O
13bf0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
13c00 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
13c10 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42  00L..    bne = B
13c20 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73  N_new();..    rs
13c30 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09  a = RSA_new();..
13c40 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50      pkey = EVP_P
13c50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20  KEY_new();..    
13c60 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20  if (bne == NULL 
13c70 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c  || rsa == NULL |
13c80 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c  | pkey == NULL |
13c90 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62  | !BN_set_word(b
13ca0 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09  ne,RSA_F4) ||...
13cb0 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65  !RSA_generate_ke
13cc0 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a  y_ex(rsa, keysiz
13cd0 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c  e, bne, NULL) ||
13ce0 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67   !EVP_PKEY_assig
13cf0 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29  n_RSA(pkey, rsa)
13d00 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  ) {...EVP_PKEY_f
13d10 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20  ree(pkey);.../* 
13d20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66  RSA_free(rsa); f
13d30 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59  reed by EVP_PKEY
13d40 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72  _free */...BN_fr
13d50 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09  ee(bne);.#else..
13d60 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52      pkey = EVP_R
13d70 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64  SA_gen((unsigned
13d80 20 69 6e 74 29 6b 65 79 73 69 7a 65 29 3b 0a 09   int)keysize);..
13d90 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b      ctx = EVP_PK
13da0 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c  EY_CTX_new(pkey,
13db0 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28  NULL);..    if (
13dc0 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
13dd0 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  ctx == NULL || !
13de0 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f  EVP_PKEY_keygen_
13df0 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21  init(ctx) ||...!
13e00 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74  EVP_PKEY_CTX_set
13e10 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73  _rsa_keygen_bits
13e20 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c  (ctx, keysize) |
13e30 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
13e40 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20  en(ctx, &pkey)) 
13e50 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
13e60 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50  e(pkey);...EVP_P
13e70 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78  KEY_CTX_free(ctx
13e80 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f  );.#endif...Tcl_
13e90 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
13ea0 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
13eb0 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c  ng private key",
13ec0 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
13ed0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
13ee0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69  } else {...if (i
13ef0 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
13f00 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
13f10 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
13f20 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
13f30 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
13f40 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
13f50 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d  ,NULL);...    i=
13f60 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
13f70 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
13f80 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
13f90 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
13fa0 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
13fb0 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
13fc0 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f  tVar(interp,keyo
13fd0 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
13fe0 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
13ff0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14000 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
14010 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
14020 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
14030 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
14040 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
14050 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20  t,keyout);...   
14060 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
14070 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
14080 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
14090 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
140a0 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69   /* PEM_write_bi
140b0 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28  o_RSAPrivateKey(
140c0 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20  out, rsa, NULL, 
140d0 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e  NULL, 0, NULL, N
140e0 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42  ULL); */...    B
140f0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
14100 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63  ;.. .}....if ((c
14110 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d  ert=X509_new())=
14120 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54  =NULL) {...    T
14130 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14140 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
14150 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ating certificat
14160 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29  e request",NULL)
14170 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59  ;...    EVP_PKEY
14180 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
14190 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
141a0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
141b0 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66  0000L...    BN_f
141c0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
141d0 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
141e0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
141f0 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e  X509_set_version
14200 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31  (cert,2);...ASN1
14210 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30  _INTEGER_set(X50
14220 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62  9_get_serialNumb
14230 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29  er(cert),serial)
14240 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
14250 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
14260 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29  tBefore(cert),0)
14270 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
14280 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
14290 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f  tAfter(cert),(lo
142a0 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73  ng)60*60*24*days
142b0 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75  );...X509_set_pu
142c0 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b  bkey(cert,pkey);
142d0 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65  ....name=X509_ge
142e0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
142f0 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41  ert);....X509_NA
14300 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
14310 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42  txt(name,"C", MB
14320 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
14330 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14340 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c   *) k_C, -1, -1,
14350 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
14360 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
14370 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53  t(name,"ST", MBS
14380 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14390 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
143a0 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c  *) k_ST, -1, -1,
143b0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
143c0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
143d0 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54  t(name,"L", MBST
143e0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
143f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14400 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_L, -1, -1, 0
14410 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
14420 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14430 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49  name,"O", MBSTRI
14440 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14450 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14460 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_O, -1, -1, 0);
14470 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14480 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14490 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e  me,"OU", MBSTRIN
144a0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
144b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
144c0 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
144d0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
144e0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
144f0 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
14500 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14510 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14520 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _CN, -1, -1, 0);
14530 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14540 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14550 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54  me,"Email", MBST
14560 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14570 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14580 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d  ) k_Email, -1, -
14590 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73  1, 0);....X509_s
145a0 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
145b0 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69  cert,name);....i
145c0 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65  f (!X509_sign(ce
145d0 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32  rt,pkey,EVP_sha2
145e0 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58  56())) {...    X
145f0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
14600 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
14610 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
14620 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
14630 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
14640 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65  00L...    BN_fre
14650 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
14660 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
14670 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
14680 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69   signing certifi
14690 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  cate",NULL);... 
146a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
146b0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
146c0 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f  isStr) {...    o
146d0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
146e0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50  _mem());...    P
146f0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
14700 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
14710 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
14720 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
14730 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
14740 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
14750 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
14760 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
14770 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
14780 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,pemout,buffer,0
14790 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
147a0 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
147b0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
147c0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
147d0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
147e0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
147f0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
14800 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a  me(out,pemout);.
14810 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
14820 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72  bio_X509(out,cer
14830 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14840 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d  ee_all(out);...}
14850 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65  ....X509_free(ce
14860 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  rt);...EVP_PKEY_
14870 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
14880 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14890 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
148a0 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62  000L...BN_free(b
148b0 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20  ne);.#endif..   
148c0 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20   }..}..break;.  
148d0 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61    default:..brea
148e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
148f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
14900 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14910 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20  *****/./* Init  
14920 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a             */./*
14930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14940 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
14950 2d 2d 2d 2d 2d 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 0a 20  --------------. 
14990 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
149a0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
149b0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
149c0 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
149d0 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
149e0 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
149f0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
14a00 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
14a10 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
14a20 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
14a30 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
14a40 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
14a50 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a80 2d 2d 2d 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 0a 20 2a  -------------. *
14aa0 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
14ab0 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62  tls_free_type *b
14ac0 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53  lockPtr) {.    S
14ad0 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
14ae0 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50   (State *)blockP
14af0 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
14b00 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
14b10 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65   Tls_Clean(state
14b20 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65  Ptr);.    ckfree
14b30 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a  (blockPtr);.}...
14b40 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
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 0a 20 2a 0a 20 2a 20 54  --------. *. * T
14b90 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20  ls_Clean --. *. 
14ba0 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
14bb0 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
14bc0 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
14bd0 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
14be0 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
14bf0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
14c00 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20  falls below 1.  
14c10 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62  This should. *.b
14c20 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f  e called synchro
14c30 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c  nously by the Cl
14c40 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20  oseProc, not in 
14c50 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c  the. *.Eventuall
14c60 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  yFree callback..
14c70 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
14c80 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
14c90 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
14ca0 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
14cb0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
14d00 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74  oid Tls_Clean(St
14d10 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b  ate *statePtr) {
14d20 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
14d30 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a  lled");..    /*.
14d40 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73       * we're ass
14d50 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20  uming here that 
14d60 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72  we're single-thr
14d70 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20  eaded.     */.  
14d80 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14d90 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
14da0 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
14db0 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
14dc0 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
14dd0 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
14de0 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e  tePtr->timer = N
14df0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
14e00 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
14e10 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28  otos) {..ckfree(
14e20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14e30 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  );..statePtr->pr
14e40 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  otos = NULL;.   
14e50 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14e60 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20  Ptr->bio) {../* 
14e70 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53  This will call S
14e80 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67  SL_shutdown. Bug
14e90 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72   1414045 */..dpr
14ea0 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61  intf("BIO_free_a
14eb0 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ll(%p)", statePt
14ec0 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72  r->bio);..BIO_fr
14ed0 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d  ee_all(statePtr-
14ee0 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72  >bio);..statePtr
14ef0 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->bio = NULL;.  
14f00 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14f10 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70  ePtr->ssl) {..dp
14f20 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28  rintf("SSL_free(
14f30 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  %p)", statePtr->
14f40 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28  ssl);..SSL_free(
14f50 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
14f60 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d  .statePtr->ssl =
14f70 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14f80 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
14f90 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66  tx) {..SSL_CTX_f
14fa0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ree(statePtr->ct
14fb0 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  x);..statePtr->c
14fc0 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  tx = NULL;.    }
14fd0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14fe0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09  r->callback) {..
14ff0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
15000 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
15010 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ack);..statePtr-
15020 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c  >callback = NULL
15030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
15040 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
15050 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  rd) {..Tcl_DecrR
15060 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
15070 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74  ->password);..st
15080 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
15090 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
150a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
150b0 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65  >vcmd) {..Tcl_De
150c0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
150d0 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61  Ptr->vcmd);..sta
150e0 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55  tePtr->vcmd = NU
150f0 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  LL;.    }..    d
15100 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
15110 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  g");.}.../*. *--
15120 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 42 75 69 6c 64  ----. *. * Build
15170 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d   Info Command --
15180 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f  . *. *.Create co
15190 6d 6d 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20  mmand to return 
151a0 62 75 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70  build info for p
151b0 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65  ackage.. *. * Re
151c0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
151d0 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a  dard Tcl result.
151e0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
151f0 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62  ts:. *.Created b
15200 75 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e  uild-info comman
15210 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
15220 2d 2d 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 0a 20  --------------. 
15260 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49  */..#ifndef STRI
15270 4e 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20  NGIFY.#  define 
15280 53 54 52 49 4e 47 49 46 59 28 78 29 20 53 54 52  STRINGIFY(x) STR
15290 49 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64 65  INGIFY1(x).#  de
152a0 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28  fine STRINGIFY1(
152b0 78 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e  x) #x.#endif..in
152c0 74 0a 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61  t.BuildInfoComma
152d0 6e 64 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69  nd(Tcl_Interp* i
152e0 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c  nterp) {.    Tcl
152f0 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  _CmdInfo info;..
15300 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
15310 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
15320 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64  p, "::tcl::build
15330 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20  -info", &info)) 
15340 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  {..Tcl_CreateObj
15350 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15360 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e  "::tls::build-in
15370 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f  fo", info.objPro
15380 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50  c, (void *)(...P
15390 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22  ACKAGE_VERSION "
153a0 2b 22 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53  +" STRINGIFY(TLS
153b0 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23  _VERSION_UUID).#
153c0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  if defined(__cla
153d0 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ng__) && defined
153e0 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f  (__clang_major__
153f0 29 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67  )....    ".clang
15400 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63  -" STRINGIFY(__c
15410 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69  lang_major__).#i
15420 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f  f __clang_minor_
15430 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30  _ < 10....    "0
15440 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20  ".#endif....    
15450 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e  STRINGIFY(__clan
15460 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69  g_minor__).#endi
15470 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
15480 63 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64  cplusplus) && !d
15490 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29  efined(__OBJC__)
154a0 0a 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70  ....    ".cplusp
154b0 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  lus".#endif.#ifn
154c0 64 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20  def NDEBUG....  
154d0 20 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69    ".debug".#endi
154e0 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  f.#if !defined(_
154f0 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65  _clang__) && !de
15500 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f  fined(__INTEL_CO
15510 4d 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e  MPILER) && defin
15520 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09  ed(__GNUC__)....
15530 20 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49      ".gcc-" STRI
15540 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a  NGIFY(__GNUC__).
15550 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52  #if __GNUC_MINOR
15560 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22  __ < 10....    "
15570 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20  0".#endif....   
15580 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55   STRINGIFY(__GNU
15590 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69  C_MINOR__).#endi
155a0 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c  f.#ifdef __INTEL
155b0 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20  _COMPILER....   
155c0 20 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49   ".icc-" STRINGI
155d0 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  FY(__INTEL_COMPI
155e0 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  LER).#endif.#ifd
155f0 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47  ef TCL_MEM_DEBUG
15600 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62  ....    ".memdeb
15610 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ug".#endif.#if d
15620 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
15630 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22  ....    ".msvc-"
15640 20 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f   STRINGIFY(_MSC_
15650 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  VER).#endif.#ifd
15660 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09  ef USE_NMAKE....
15670 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e      ".nmake".#en
15680 64 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f  dif.#ifndef TCL_
15690 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09  CFG_OPTIMIZED...
156a0 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69  .    ".no-optimi
156b0 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ze".#endif.#ifde
156c0 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20  f __OBJC__....  
156d0 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22    ".objective-c"
156e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63  .#if defined(__c
156f0 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20  plusplus)....   
15700 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64   "plusplus".#end
15710 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
15720 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45   TCL_CFG_PROFILE
15730 44 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69  D....    ".profi
15740 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  le".#endif.#ifde
15750 66 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20  f PURIFY....    
15760 22 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66  ".purify".#endif
15770 0a 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42  .#ifdef STATIC_B
15780 55 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74  UILD....    ".st
15790 61 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29  atic".#endif...)
157a0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  , NULL);.    }. 
157b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
157c0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
157d0 2d 2d 2d 2d 2d 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 0a 20  --------------. 
15810 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d  *. * Tls_Init --
15820 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
15830 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
15840 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
15850 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c  e, which is call
15860 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65  ed. *.by Tcl whe
15870 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69  n this package i
15880 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
15890 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e   an interpreter.
158a0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20  . *. * Results: 
158b0 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20   Ssl configured 
158c0 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a  and loaded. *. *
158d0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
158e0 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73  *. create the ss
158f0 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69  l command, initi
15900 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78  alize ssl contex
15910 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
15920 2d 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 0a 20 2a 2f 0a 0a  ----------. */..
15960 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  #if TCL_MAJOR_VE
15970 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e  RSION > 8.#defin
15980 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39  e MIN_VERSION "9
15990 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .0".#else.#defin
159a0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38  e MIN_VERSION "8
159b0 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  .5".#endif..stat
159c0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c  ic const char tl
159d0 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d  sTclInitScript[]
159e0 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74   = {.#include "t
159f0 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a  ls.tcl.h"..0x00.
15a00 20 20 20 20 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52      };..DLLEXPOR
15a10 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54  T int Tls_Init(T
15a20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15a30 70 29 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74  p) {..    dprint
15a40 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
15a50 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  fdef USE_TCL_STU
15a60 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49  BS.    if (Tcl_I
15a70 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
15a80 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29   MIN_VERSION, 0)
15a90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
15aa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15ab0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15ac0 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69  if (Tcl_PkgRequi
15ad0 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22  re(interp, "Tcl"
15ae0 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30  , MIN_VERSION, 0
15af0 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
15b00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15b10 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
15b20 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20  lsLibInit(0) != 
15b30 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41  TCL_OK) {..Tcl_A
15b40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15b50 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
15b60 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
15b70 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29  brary", (char *)
15b80 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
15b90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15ba0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15bb0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15bc0 2c 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72  , "::tls::cipher
15bd0 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  s", CiphersObjCm
15be0 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c  d, (void *) NULL
15bf0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15c00 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15c10 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15c20 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15c30 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69  "::tls::connecti
15c40 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  on", ConnectionI
15c50 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64  nfoObjCmd, (void
15c60 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43   *) NULL, (Tcl_C
15c70 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
15c80 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
15c90 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15ca0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
15cb0 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
15cc0 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 76 6f  shakeObjCmd, (vo
15cd0 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  id *) NULL, (Tcl
15ce0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15cf0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15d00 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15d10 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
15d20 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
15d30 74 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a  tObjCmd, (void *
15d40 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
15d50 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15d60 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15d70 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15d80 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e  terp, "::tls::un
15d90 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72  import", Unimpor
15da0 74 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a  tObjCmd, (void *
15db0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
15dc0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15dd0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15de0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15df0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74  terp, "::tls::st
15e00 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a  atus", StatusObj
15e10 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55  Cmd, (void *) NU
15e20 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
15e30 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15e40 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15e50 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15e60 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f  , "::tls::versio
15e70 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  n", VersionObjCm
15e80 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c  d, (void *) NULL
15e90 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15ea0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15eb0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15ec0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15ed0 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d  "::tls::misc", M
15ee0 69 73 63 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64  iscObjCmd, (void
15ef0 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43   *) NULL, (Tcl_C
15f00 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
15f10 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
15f20 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15f30 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
15f40 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74  protocols", Prot
15f50 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 76 6f  ocolsObjCmd, (vo
15f60 69 64 20 2a 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  id *) NULL, (Tcl
15f70 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15f80 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75  ) NULL);..    Bu
15f90 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69  ildInfoCommand(i
15fa0 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20  nterp);..    if 
15fb0 28 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45  (interp && Tcl_E
15fc0 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54  val(interp, tlsT
15fd0 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d  clInitScript) !=
15fe0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
15ff0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16000 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
16010 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
16020 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e  nterp, PACKAGE_N
16030 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52  AME, PACKAGE_VER
16040 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  SION);.}../*. *-
16050 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
16090 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a  _SafeInit --. *.
160a0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
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 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64  ---*. *.Standard
160e0 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69   procedure requi
160f0 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20  red by 'load'.. 
16100 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  *.Initializes th
16110 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72  is extension for
16120 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65   a safe interpre
16130 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  ter.. *.--------
16140 2d 2d 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 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
16170 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
16180 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69  ..As of 'Tls_Ini
16190 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  t'. *. *.Result:
161a0 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20  . *..A standard 
161b0 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  Tcl error code..
161c0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
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 2a 0a 20 2a 2f  -----------*. */
16200 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  ..DLLEXPORT int 
16210 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  Tls_SafeInit(Tcl
16220 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
16230 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
16240 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  Called");.    re
16250 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e  turn Tls_Init(in
16260 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  terp);.}../*. *-
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
162b0 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  LibInit --. *. *
162c0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
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 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  -*. *.Initialize
16300 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e  s SSL library on
16310 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69  ce per applicati
16320 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  on. *.----------
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 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
16360 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
16370 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  initializes SSL 
16380 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65  library. *. *.Re
16390 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20  sult:. *..none. 
163a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
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 2a 0a 20 2a 2f 0a  ----------*. */.
163e0 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69  static int TlsLi
163f0 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
16400 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74  ialize) {.    st
16410 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c  atic int initial
16420 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ized = 0;.    in
16430 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f  t status = TCL_O
16440 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  K;.#if defined(O
16450 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16460 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16470 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65  HREADS).    size
16480 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65  _t num_locks;.#e
16490 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e  ndif..    if (un
164a0 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69  initialize) {..i
164b0 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29  f (!initialized)
164c0 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
164d0 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74  "Asked to uninit
164e0 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61  ialize, but we a
164f0 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  re not initializ
16500 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75  ed");...    retu
16510 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09  rn TCL_OK;..}...
16520 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
16530 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29  o uninitialize")
16540 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
16550 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16560 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16570 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
16580 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
16590 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b  ;...if (locks) {
165a0 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73  ..    free(locks
165b0 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20  );..    locks = 
165c0 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73  NULL;..    locks
165d0 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65  Count = 0;..}.#e
165e0 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65  ndif..initialize
165f0 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69  d = 0;..#if defi
16600 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16610 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16620 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
16630 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69  l_MutexUnlock(&i
16640 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
16650 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  ..return TCL_OK;
16660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
16670 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
16680 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
16690 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
166a0 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75  d value");..retu
166b0 72 6e 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d  rn status;.    }
166c0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
166d0 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
166e0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
166f0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
16700 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
16710 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b     Tcl_MutexLock
16720 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
16730 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a  if.    initializ
16740 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66  ed = 1;..#if def
16750 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
16760 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
16770 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
16780 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b    num_locks = 1;
16790 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20  .    locksCount 
167a0 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b  = (int) num_lock
167b0 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d  s;.    locks = m
167c0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f  alloc(sizeof(*lo
167d0 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
167e0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f  );.    memset(lo
167f0 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  cks, 0, sizeof(*
16800 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
16810 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ks);.#endif..   
16820 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42   /* Initialize B
16830 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e  OTH libcrypto an
16840 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20  d libssl. */.   
16850 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73   OPENSSL_init_ss
16860 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  l(OPENSSL_INIT_L
16870 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20  OAD_SSL_STRINGS 
16880 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  | OPENSSL_INIT_L
16890 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e  OAD_CRYPTO_STRIN
168a0 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  GS..| OPENSSL_IN
168b0 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45  IT_ADD_ALL_CIPHE
168c0 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  RS | OPENSSL_INI
168d0 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54  T_ADD_ALL_DIGEST
168e0 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42  S, NULL);..    B
168f0 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c  IO_new_tcl(NULL,
16900 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20   0);..#if 0.    
16910 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f  /*.     * XXX:TO
16920 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20  DO: Remove this 
16930 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65  code and replace
16940 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b   it with a check
16950 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75  .     * for enou
16960 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64  gh entropy and d
16970 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65  o not try to cre
16980 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20  ate our own.    
16990 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72   * terrible entr
169a0 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  opy.     */.    
169b0 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74  /*.     * Seed t
169c0 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
169d0 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68   generator in th
169e0 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20  e SSL library,. 
169f0 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20      * using the 
16a00 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75  do/while constru
16a10 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ct because of th
16a20 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68  e bug note in th
16a30 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c  e.     * OpenSSL
16a40 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77   FAQ at http://w
16a50 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73  ww.openssl.org/s
16a60 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23  upport/faq.html#
16a70 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20  USER1.     *.   
16a80 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20    * The crux of 
16a90 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
16aa0 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f  hat Solaris 7 do
16ab0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20  es not have a.  
16ac0 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d     * /dev/random
16ad0 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d   or /dev/urandom
16ae0 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61   device so it ca
16af0 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75  nnot gather enou
16b00 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70  gh.     * entrop
16b10 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f  y from the RAND_
16b20 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20  seed() when TLS 
16b30 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20  initializes and 
16b40 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74  refuses.     * t
16b50 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61  o go further. Ea
16b60 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
16b70 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65  f OpenSSL carrie
16b80 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e  d on regardless.
16b90 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61  .     */.    sra
16ba0 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  nd((unsigned int
16bb0 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a  ) time((time_t *
16bc0 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f  ) NULL));.    do
16bd0 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20   {..for (i = 0; 
16be0 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09  i < 16; i++) {..
16bf0 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20      rnd_seed[i] 
16c00 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35  = 1 + (char) (25
16c10 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41  5.0 * rand()/(RA
16c20 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d  ND_MAX+1.0));..}
16c30 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f  ..RAND_seed(rnd_
16c40 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64  seed, sizeof(rnd
16c50 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77  _seed));.    } w
16c60 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75  hile (RAND_statu
16c70 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69  s() != 1);.#endi
16c80 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  f..#if defined(O
16c90 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16ca0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16cb0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
16cc0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
16cd0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  t_mx);.#endif.. 
16ce0 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 75 73     return status
16cf0 3b 0a 7d 0a                                      ;.}.