Hex Artifact Content

Artifact 0bbe388ea9b8e189d4662029d881ee41f2e1ac105786d51c5f3cff5a729e7d97:


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 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
6610: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6620: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6630: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61  }..    /* Get na
6640: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  mes */.    if (!
6650: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  SSL_client_hello
6660: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54  _get0_ext(ssl, T
6670: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65  LSEXT_TYPE_serve
6680: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d  r_name, &p, &rem
6690: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69  aining) || remai
66a0: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61  ning <= 2) {..*a
66b0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c  lert = SSL_R_SSL
66c0: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c  V3_ALERT_ILLEGAL
66d0: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74  _PARAMETER;..ret
66e0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
66f0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6700: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
6710: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
6720: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73  the supplied lis
6730: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20  t of names. */. 
6740: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
6750: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
6760: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
6770: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65  f (len + 2 != re
6780: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6790: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33  rt = SSL_R_SSLV3
67a0: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50  _ALERT_ILLEGAL_P
67b0: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72  ARAMETER;..retur
67c0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
67d0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
67e0: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20      remaining = 
67f0: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  len;..    /* The
6800: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63   list in practic
6810: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e  e only has a sin
6820: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20  gle element, so 
6830: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  we only consider
6840: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20   the first one. 
6850: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69  */.    if (remai
6860: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b  ning == 0 || *p+
6870: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45  + != TLSEXT_NAME
6880: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20  TYPE_host_name) 
6890: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
68a0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
68b0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
68c0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
68d0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
68e0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
68f0: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  g--;..    /* Now
6900: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20   we can finally 
6910: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74  pull out the byt
6920: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
6930: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65   actual hostname
6940: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d  . */.    if (rem
6950: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09  aining <= 2) {..
6960: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6970: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
6980: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
6990: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
69a0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
69b0: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b  .    len = (*(p+
69c0: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65  +) << 8);.    le
69d0: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20  n += *(p++);.   
69e0: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72   if (len + 2 > r
69f0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
6a00: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6a10: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6a20: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
6a30: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6a40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6a50: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
6a60: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d  n;.    servernam
6a70: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
6a80: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  *)p;..    /* Cre
6a90: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
6aa0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
6ab0: 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61  n, and server na
6ac0: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  me args */.    c
6ad0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
6ae0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
6af0: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
6b00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6b10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6b20: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
6b30: 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c  ringObj("hello",
6b40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
6b50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6b60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
6b70: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
6b80: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
6b90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
6ba0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
6bb0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
6bc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6bd0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
6be0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6bf0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 54  j(servername, (T
6c00: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b 0a  cl_Size) len));.
6c10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
6c20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
6c30: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
6c40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
6c50: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
6c60: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
6c70: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
6c80: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
6c90: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6ca0: 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61  HELLO_RETRY;..*a
6cb0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6cc0: 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41  V1_ALERT_USER_CA
6cd0: 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65  NCELLED;.    } e
6ce0: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
6cf0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6d00: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6d10: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
6d20: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
6d30: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6d40: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6d50: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6d60: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20  TERNAL_ERROR;.  
6d70: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
6d80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6d90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
6da0: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
6dc0: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20  Commands        
6dd0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
6df0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 69 70 68 65  ----. *. * Ciphe
6e40: 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74  rsObjCmd -- list
6e50: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
6e60: 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  rs. *. *.This pr
6e70: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
6e80: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
6e90: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  e "tls::ciphers"
6ea0: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
6eb0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69  ist available ci
6ec0: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f  phers, based upo
6ed0: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  n protocol selec
6ee0: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ted.. *. * Resul
6ef0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
6f00: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73  d Tcl result lis
6f10: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
6f20: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
6f30: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79  ucts and destroy
6f40: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
6f50: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
6f60: 2d 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 0a 20 2a 2f  ------------. */
6fa0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6fb0: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20  ar *protocols[] 
6fc0: 3d 20 7b 0a 20 20 20 20 22 73 73 6c 32 22 2c 20  = {.    "ssl2", 
6fd0: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20  "ssl3", "tls1", 
6fe0: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e  "tls1.1", "tls1.
6ff0: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55  2", "tls1.3", NU
7000: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f  LL.};.enum proto
7010: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53  col {.    TLS_SS
7020: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c  L2, TLS_SSL3, TL
7030: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31  S_TLS1, TLS_TLS1
7040: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20  _1, TLS_TLS1_2, 
7050: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f  TLS_TLS1_3, TLS_
7060: 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  NONE.};..static 
7070: 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d  int.CiphersObjCm
7080: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
7090: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
70a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
70b0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
70c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f  .    Tcl_Obj.*co
70d0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
70e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
70f0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
7100: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
7110: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
7120: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
7130: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
7140: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62   *sk;.    char b
7150: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
7160: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
7170: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
7180: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
7190: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
71a0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70  *method;..    dp
71b0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
71c0: 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  ..    if ((objc 
71d0: 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20  < 2) || (objc > 
71e0: 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67  4)) {..Tcl_Wrong
71f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
7200: 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63  1, objv, "protoc
7210: 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75  ol ?verbose? ?su
7220: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74  pported?");..ret
7230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7240: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
7250: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
7260: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
7270: 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72  , protocols, "pr
7280: 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64  otocol", 0, &ind
7290: 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ex) != TCL_OK) {
72a0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
72b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
72c0: 20 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20   ((objc > 2) && 
72d0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
72e0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
72f0: 6a 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29  jv[2], &verbose)
7300: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
7310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7320: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
7330: 6f 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c  objc > 3) && Tcl
7340: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
7350: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7360: 33 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74  3], &use_support
7370: 65 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ed) != TCL_OK) {
7380: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7390: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
73a0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
73b0: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  ;..    switch ((
73c0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e  enum protocol)in
73d0: 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65 20  dex) {.    case 
73e0: 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50  TLS_SSL2:.#if OP
73f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
7400: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30  MBER >= 0x101000
7410: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e  00L || defined(N
7420: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e  O_SSL2) || defin
7430: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7440: 4c 32 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  L2)..Tcl_AppendR
7450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
7460: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7470: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7480: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
7490: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
74a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
74b0: 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53  lse..method = SS
74c0: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Lv2_method(); br
74d0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
74e0: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23  case TLS_SSL3:.#
74f0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
7500: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
7510: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
7520: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7530: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
7540: 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  D)..Tcl_AppendRe
7550: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
7560: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
7570: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7580: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
7590: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72   *)NULL);..retur
75a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
75b0: 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c  se..method = SSL
75c0: 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  v3_method(); bre
75d0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  ak;.#endif.    c
75e0: 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69  ase TLS_TLS1:.#i
75f0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
7600: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
7610: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c  ENSSL_NO_TLS1) |
7620: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7630: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
7640: 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  )..Tcl_AppendRes
7650: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7660: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7670: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7680: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7690: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
76a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
76b0: 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76  e..method = TLSv
76c0: 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  1_method(); brea
76d0: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  k;.#endif.    ca
76e0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23  se TLS_TLS1_1:.#
76f0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7700: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
7710: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7720: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
7730: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
7740: 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70  _METHOD)..Tcl_Ap
7750: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7760: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7770: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7780: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7790: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
77a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
77b0: 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64  R;.#else..method
77c0: 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f   = TLSv1_1_metho
77d0: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
77e0: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  if.    case TLS_
77f0: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69  TLS1_2:.#if defi
7800: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
7810: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7820: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  L_NO_TLS1_2) || 
7830: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7840: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
7850: 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  )..Tcl_AppendRes
7860: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7870: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7880: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7890: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
78a0: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
78b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
78c0: 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76  e..method = TLSv
78d0: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  1_2_method(); br
78e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
78f0: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a  case TLS_TLS1_3:
7900: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7910: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
7920: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7930: 53 31 5f 33 29 0a 09 54 63 6c 5f 41 70 70 65 6e  S1_3)..Tcl_Appen
7940: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7950: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7960: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7970: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
7980: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
7990: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
79a0: 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20  #else..method = 
79b0: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 53  TLS_method();..S
79c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
79d0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
79e0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
79f0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
7a00: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
7a10: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
7a20: 52 53 49 4f 4e 29 3b 0a 09 62 72 65 61 6b 3b 0a  RSION);..break;.
7a30: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
7a40: 6c 74 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c  lt:..method = TL
7a50: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  S_method();..bre
7a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
7a70: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
7a80: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66  (method);.    if
7a90: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ctx == NULL) {
7aa0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
7ab0: 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45  lt(interp, GET_E
7ac0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
7ad0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
7ae0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7af0: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20     }..    ssl = 
7b00: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20  SSL_new(ctx);.  
7b10: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
7b20: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7b30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
7b40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
7b50: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
7b60: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
7b70: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  x);..return TCL_
7b80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7b90: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e    /* Use list an
7ba0: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64  d order as would
7bb0: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c   be sent in a Cl
7bc0: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c  ientHello or all
7bd0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
7be0: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73  rs */.    if (us
7bf0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
7c00: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75  sk = SSL_get1_su
7c10: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28  pported_ciphers(
7c20: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ssl);.    } else
7c30: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
7c40: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20  _ciphers(ssl);. 
7c50: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b     }..    if (sk
7c60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   != NULL) {..if 
7c70: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20  (!verbose) {..  
7c80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70    const char *cp
7c90: 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
7ca0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
7cb0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f  , NULL);..    fo
7cc0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
7cd0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
7ce0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
7cf0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
7d00: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
7d10: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
7d20: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
7d30: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
7d40: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65  ../* cipher name
7d50: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09   or (NONE) */...
7d60: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  cp = SSL_CIPHER_
7d70: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69  get_name(c);...i
7d80: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62  f (cp == NULL) b
7d90: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  reak;...Tcl_List
7da0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
7db0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
7dc0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7dd0: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20  j(cp, -1));..   
7de0: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20   }...} else {.. 
7df0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7e00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
7e10: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e  0);..    for (in
7e20: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
7e30: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
7e40: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e  k); i++) {...con
7e50: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
7e60: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   = sk_SSL_CIPHER
7e70: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09  _value(sk, i);..
7e80: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20  .if (c == NULL) 
7e90: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20  continue;..../* 
7ea0: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74  textual descript
7eb0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65  ion of the ciphe
7ec0: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43  r */...if (SSL_C
7ed0: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
7ee0: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  n(c, buf, sizeof
7ef0: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (buf)) != NULL) 
7f00: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
7f10: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20  ndToObj(objPtr, 
7f20: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  buf, (Tcl_Size) 
7f30: 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09  strlen(buf));...
7f40: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54  } else {...    T
7f50: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f  cl_AppendToObj(o
7f60: 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c  bjPtr, "UNKNOWN\
7f70: 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20  n", 8);...}..   
7f80: 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73   }..}..if (use_s
7f90: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20  upported) {..   
7fa0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66   sk_SSL_CIPHER_f
7fb0: 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20  ree(sk);..}.    
7fc0: 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73  }.    SSL_free(s
7fd0: 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  sl);.    SSL_CTX
7fe0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20  _free(ctx);..   
7ff0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
8000: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8020: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
8030: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f  --. *. * Protoco
8080: 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74  lsObjCmd -- list
8090: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f   available proto
80a0: 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  cols. *. *.This 
80b0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
80c0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
80d0: 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63  the "tls::protoc
80e0: 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09  ols" command. *.
80f0: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  to list availabl
8100: 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a  e protocols.. *.
8110: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
8120: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
8130: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  sult list.. *. *
8140: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
8150: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  *.none. *. *----
8160: 2d 2d 2d 2d 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 0a  ---------------.
81a0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a   */..static int.
81b0: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
81c0: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
81d0: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c  void *),.    Tcl
81e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
81f0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
8200: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
8210: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8220: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
8230: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
8240: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
8250: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09   (objc != 1) {..
8260: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8270: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
8280: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  , "");..return T
8290: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
82a0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
82b0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a  rror();..    obj
82c0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
82d0: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
82e0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
82f0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
8300: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
8310: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
8320: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8330: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54  L_NO_SSL2).    T
8340: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8350: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8360: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8370: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
8380: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31  ls[TLS_SSL2], -1
8390: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
83a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
83b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
83c0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
83d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
83e0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
83f0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
8400: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8410: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8420: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8430: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
8440: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L3], -1));.#endi
8450: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8460: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
8470: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8480: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
8490: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
84a0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
84b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
84c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
84d0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
84e0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
84f0: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29  [TLS_TLS1], -1))
8500: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8510: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
8520: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8530: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
8540: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8550: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
8560: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
8570: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8580: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8590: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
85a0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
85b0: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b  S_TLS1_1], -1));
85c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
85d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
85e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
85f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  SSL_NO_TLS1_2) &
8600: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8610: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54  SL_NO_TLS1_2_MET
8620: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
8630: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8640: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8650: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8660: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8670: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_2], -1));.
8680: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8690: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
86a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
86b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
86c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
86d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
86e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
86f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
8700: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33  ocols[TLS_TLS1_3
8710: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8720: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
8730: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
8740: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
8750: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
8760: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 48 61 6e  ------. *. * Han
87b0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a  dshakeObjCmd --.
87c0: 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61   *. *.This comma
87d0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 65  nd is used to ve
87e0: 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68 65  rify whether the
87f0: 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f   handshake is co
8800: 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74  mplete. *.or not
8810: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
8820: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
8830: 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61  cl result. 1 mea
8840: 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d  ns handshake com
8850: 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70  plete, 0 means p
8860: 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69  ending.. *. * Si
8870: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
8880: 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67  ay force SSL neg
8890: 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65  otiation to take
88a0: 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d   place.. *. *---
88b0: 2d 2d 2d 2d 2d 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: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
8900: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
8910: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  (.    TCL_UNUSED
8920: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63  (void *),.    Tc
8930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8940: 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  ,.    int objc,.
8950: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
8960: 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20  st objv[]).{.   
8970: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
8980: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n;        /* The
8990: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
89a0: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
89b0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
89c0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69  r;        /* cli
89d0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
89e0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
89f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53  const char *errS
8a00: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  tr = NULL;.    i
8a10: 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20  nt ret = 1;.    
8a20: 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20  int err = 0;..  
8a30: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
8a40: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
8a50: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
8a60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8a70: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
8a80: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
8a90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8aa0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
8ab0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
8ac0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
8ad0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
8ae0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
8af0: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  [1]), NULL);.   
8b00: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
8b10: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
8b20: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
8b30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8b40: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
8b50: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
8b60: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
8b70: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
8b80: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
8b90: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
8ba0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
8bb0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
8bc0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
8bd0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8be0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
8bf0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
8c00: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
8c10: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
8c20: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
8c30: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
8c40: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
8c50: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
8c60: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43   "HANDSHAKE", "C
8c70: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
8c80: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
8c90: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
8ca0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8cb0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
8cc0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
8cd0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
8ce0: 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  han);..    dprin
8cf0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f  tf("Calling Tls_
8d00: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29  WaitForConnect")
8d10: 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f  ;.    ret = Tls_
8d20: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73  WaitForConnect(s
8d30: 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31  tatePtr, &err, 1
8d40: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
8d50: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8d60: 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22  ct returned: %i"
8d70: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20  , ret);..    if 
8d80: 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74  (ret < 0 && ((st
8d90: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
8da0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26  TLS_TCL_ASYNC) &
8db0: 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e  & (err == EAGAIN
8dc0: 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  ))) {..dprintf("
8dd0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72  Async set and er
8de0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72  r = EAGAIN");..r
8df0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c  et = 0;.    } el
8e00: 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20  se if (ret < 0) 
8e10: 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a  {..long result;.
8e20: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50  .errStr = stateP
8e30: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65  tr->err;..Tcl_Re
8e40: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
8e50: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f  );..Tcl_SetErrno
8e60: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72  (err);...if (!er
8e70: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72  rStr || (*errStr
8e80: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65   == 0)) {..    e
8e90: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69  rrStr = Tcl_Posi
8ea0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  xError(interp);.
8eb0: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  .}...Tcl_AppendR
8ec0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68  esult(interp, "h
8ed0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a  andshake failed:
8ee0: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61   ", errStr, (cha
8ef0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  r *)NULL);..if (
8f00: 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65  (result = SSL_ge
8f10: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
8f20: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20  statePtr->ssl)) 
8f30: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
8f40: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8f50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20  esult(interp, " 
8f60: 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 39  due to \"", X509
8f70: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
8f80: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74  or_string(result
8f90: 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a  ), "\"", (char *
8fa0: 29 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f  )NULL);..}..Tcl_
8fb0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
8fc0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e  erp, "TLS", "HAN
8fd0: 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44  DSHAKE", "FAILED
8fe0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
8ff0: 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74 75  ;..dprintf("Retu
9000: 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20  rning TCL_ERROR 
9010: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66  with handshake f
9020: 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53  ailed: %s", errS
9030: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
9040: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c  _ERROR;.    } el
9050: 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d  se {..if (err !=
9060: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e   0) {..    dprin
9070: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72  tf("Got an error
9080: 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65   with a complete
9090: 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72  d handshake: err
90a0: 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d   = %i", err);..}
90b0: 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ..ret = 1;.    }
90c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
90d0: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20  eturning TCL_OK 
90e0: 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22  with data \"%i\"
90f0: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c  ", ret);.    Tcl
9100: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
9110: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
9120: 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72  Obj(ret));.    r
9130: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9140: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
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 0a 20 2a 0a 20 2a 20  ---------. *. * 
9190: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a  ImportObjCmd --.
91a0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
91b0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
91c0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
91d0: 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a  ssl" command. *.
91e0: 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61   *.The ssl comma
91f0: 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76  nd pushes SSL ov
9200: 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e  er a (newly conn
9210: 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65  ected) tcp socke
9220: 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  t. *. * Results:
9230: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
9240: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
9250: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
9260: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
9270: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
9280: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
9290: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
92e0: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d   int.ImportObjCm
92f0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
9300: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
9310: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9320: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
9330: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
9340: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
9350: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
9360: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
9370: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
9380: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
9390: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
93a0: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
93b0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
93c0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74  .    SSL_CTX *ct
93d0: 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  x..= NULL;.    T
93e0: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09  cl_Obj *script..
93f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9400: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d  Obj *password..=
9410: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
9420: 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c  bj *vcmd..= NULL
9430: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
9440: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  g upperChannelTr
9450: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72  anslation, upper
9460: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c  ChannelBlocking,
9470: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63   upperChannelEnc
9480: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  oding, upperChan
9490: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20  nelEOFChar;.    
94a0: 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c  int idx;.    Tcl
94b0: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69  _Size len;.    i
94c0: 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53  nt flags...= TLS
94d0: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69  _TCL_INIT;.    i
94e0: 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b  nt server...= 0;
94f0: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f  ./* is connectio
9500: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75  n incoming or ou
9510: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63  tgoing? */.    c
9520: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20  har *keyfile..= 
9530: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9540: 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c  certfile..= NULL
9550: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
9560: 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c  har *key..= NULL
9570: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b  ;.    Tcl_Size k
9580: 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20  ey_len..= 0;.   
9590: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
95a0: 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  cert..= NULL;.  
95b0: 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f    Tcl_Size cert_
95c0: 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68  len..= 0;.    ch
95d0: 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e  ar *ciphers..= N
95e0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
95f0: 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e  iphersuites..= N
9600: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
9610: 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20  Afile..= NULL;. 
9620: 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 09     char *CApath.
9630: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
9640: 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e  r *DHparams..= N
9650: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d  ULL;.    char *m
9660: 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20  odel...= NULL;. 
9670: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e     char *servern
9680: 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20  ame..= NULL;./* 
9690: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72  hostname for Ser
96a0: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74  ver Name Indicat
96b0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ion */.    char 
96c0: 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e  *session_id..= N
96d0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
96e0: 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a   *alpn..= NULL;.
96f0: 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30      int ssl2 = 0
9700: 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20  , ssl3 = 0;.    
9710: 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c  int tls1 = 1, tl
9720: 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32  s1_1 = 1, tls1_2
9730: 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31   = 1, tls1_3 = 1
9740: 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20  ;.    int proto 
9750: 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b  = 0, level = -1;
9760: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20  .    int verify 
9770: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30  = 0, require = 0
9780: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70  , request = 1, p
9790: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20  ost_handshake = 
97a0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
97b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20  "Called");..#if 
97c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
97d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
97e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
97f0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69   tls1 = 0;.#endi
9800: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
9810: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
9820: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9830: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_1).    tls1_
9840: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  1 = 0;.#endif.#i
9850: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
9860: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
9870: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
9880: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20  2).    tls1_2 = 
9890: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
98a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
98b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
98c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
98d0: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23     tls1_3 = 0;.#
98e0: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f  endif..    if (o
98f0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f  bjc < 2) {..Tcl_
9900: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9910: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
9920: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f  hannel ?options?
9930: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
9940: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
9950: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
9960: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
9970: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
9980: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
9990: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
99a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
99b0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
99c0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
99d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
99e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
99f0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
9a00: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
9a10: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
9a20: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
9a30: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
9a40: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  ..    for (idx =
9a50: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   2; idx < objc; 
9a60: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a  idx++) {..char *
9a70: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  opt = Tcl_GetStr
9a80: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a  ing(objv[idx]);.
9a90: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20  ..if (opt[0] != 
9aa0: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b  '-')..    break;
9ab0: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e  ...OPTOBJ("-alpn
9ac0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54  ", alpn);..OPTST
9ad0: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61  R("-cadir", CApa
9ae0: 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  th);..OPTSTR("-c
9af0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
9b00: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74  ..OPTBYTE("-cert
9b10: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65  ", cert, cert_le
9b20: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65  n);..OPTSTR("-ce
9b30: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c  rtfile", certfil
9b40: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  e);..OPTSTR("-ci
9b50: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b  pher", ciphers);
9b60: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
9b70: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  rs", ciphers);..
9b80: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9b90: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75  uites", ciphersu
9ba0: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  ites);..OPTOBJ("
9bb0: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70  -command", scrip
9bc0: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68  t);..OPTSTR("-dh
9bd0: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d  params", DHparam
9be0: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b  s);..OPTBYTE("-k
9bf0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  ey", key, key_le
9c00: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65  n);..OPTSTR("-ke
9c10: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29  yfile", keyfile)
9c20: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65  ;..OPTSTR("-mode
9c30: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54  l", model);..OPT
9c40: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c  OBJ("-password",
9c50: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54   password);..OPT
9c60: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64  BOOL("-post_hand
9c70: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e  shake", post_han
9c80: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f  dshake);..OPTBOO
9c90: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65  L("-request", re
9ca0: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quest);..OPTBOOL
9cb0: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
9cc0: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22  uire);..OPTINT("
9cd0: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22  -security_level"
9ce0: 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f  , level);..OPTBO
9cf0: 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65  OL("-server", se
9d00: 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22  rver);..OPTSTR("
9d10: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65  -servername", se
9d20: 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53  rvername);..OPTS
9d30: 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22  TR("-session_id"
9d40: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09  , session_id);..
9d50: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c  OPTBOOL("-ssl2",
9d60: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c   ssl2);..OPTBOOL
9d70: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b  ("-ssl3", ssl3);
9d80: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9d90: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f  ", tls1);..OPTBO
9da0: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c  OL("-tls1.1", tl
9db0: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_1);..OPTBOOL(
9dc0: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f  "-tls1.2", tls1_
9dd0: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  2);..OPTBOOL("-t
9de0: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b  ls1.3", tls1_3);
9df0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64  ..OPTOBJ("-valid
9e00: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d  atecommand", vcm
9e10: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63  d);..OPTOBJ("-vc
9e20: 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50  md", vcmd);...OP
9e30: 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22  TBAD("option", "
9e40: 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d  -alpn, -cadir, -
9e50: 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d  cafile, -cert, -
9e60: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65  certfile, -ciphe
9e70: 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73  r, -ciphersuites
9e80: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70  , -command, -dhp
9e90: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65  arams, -key, -ke
9ea0: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d  yfile, -model, -
9eb0: 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f  password, -post_
9ec0: 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75  handshake, -requ
9ed0: 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d  est, -require, -
9ee0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20  security_level, 
9ef0: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72  -server, -server
9f00: 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69  name, -session_i
9f10: 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c  d, -ssl2, -ssl3,
9f20: 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c   -tls1, -tls1.1,
9f30: 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e   -tls1.2, -tls1.
9f40: 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63  3, or -validatec
9f50: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75  ommand");...retu
9f60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9f70: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75    }.    if (requ
9f80: 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79 20  est).    verify 
9f90: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c  |= SSL_VERIFY_CL
9fa0: 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f  IENT_ONCE | SSL_
9fb0: 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20  VERIFY_PEER;.   
9fc0: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20   if (request && 
9fd0: 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79 20  require) verify 
9fe0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41  |= SSL_VERIFY_FA
9ff0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
a000: 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  RT;.    if (requ
a010: 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64  est && post_hand
a020: 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d  shake).verify |=
a030: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
a040: 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20  _HANDSHAKE;.    
a050: 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29  if (verify == 0)
a060: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45  .verify = SSL_VE
a070: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
a080: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
a090: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
a0a0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a0b0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
a0c0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
a0d0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a0e0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
a0f0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  LS1 : 0);.    pr
a100: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f  oto |= (tls1_1 ?
a110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
a120: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
a130: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54  o |= (tls1_2 ? T
a140: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20  LS_PROTO_TLS1_2 
a150: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a160: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53  |= (tls1_3 ? TLS
a170: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20  _PROTO_TLS1_3 : 
a180: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
a190: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
a1a0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
a1b0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
a1c0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20  rt && !*cert).. 
a1d0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20         cert.    
a1e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a1f0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
a200: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20  )..        key. 
a210: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a220: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
a230: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20  && !*certfile)  
a240: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09         certfile.
a250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a260: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79  keyfile && !*key
a270: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20  file)..keyfile. 
a280: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a290: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
a2a0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20  & !*ciphers).   
a2b0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20       ciphers.   
a2c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a2d0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65   if (ciphersuite
a2e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69  s && !*ciphersui
a2f0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65  tes) ciphersuite
a300: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  s    = NULL;.   
a310: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
a320: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20  *CAfile).       
a330: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20   CAfile.        
a340: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a350: 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61  CApath && !*CApa
a360: 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61  th).        CApa
a370: 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  th.        = NUL
a380: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  L;.    if (DHpar
a390: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d  ams && !*DHparam
a3a0: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72  s).        DHpar
a3b0: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ams        = NUL
a3c0: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53  L;..    /* new S
a3d0: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  SL state */.    
a3e0: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61  statePtr..= (Sta
a3f0: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  te *) ckalloc((u
a400: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28  nsigned) sizeof(
a410: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d  State));.    mem
a420: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c  set(statePtr, 0,
a430: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b   sizeof(State));
a440: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a450: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20  flags.= flags;. 
a460: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74     statePtr->int
a470: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp.= interp;.  
a480: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61    statePtr->vfla
a490: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20  gs.= verify;.   
a4a0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d   statePtr->err.=
a4b0: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c   "";..    /* all
a4c0: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a  ocate script */.
a4d0: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20      if (script) 
a4e0: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a4f0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73  tStringFromObj(s
a500: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69  cript, &len);..i
a510: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73  f (len) {..    s
a520: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
a530: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20  k = script;..   
a540: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a550: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  t(statePtr->call
a560: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  back);..}.    }.
a570: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a580: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20   password */.   
a590: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b   if (password) {
a5a0: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a5b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61  StringFromObj(pa
a5c0: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09  ssword, &len);..
a5d0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a5e0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
a5f0: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09  rd = password;..
a600: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a610: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70  ount(statePtr->p
a620: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20  assword);..}.   
a630: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
a640: 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d  ate validate com
a650: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  mand */.    if (
a660: 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20  vcmd) {..(void) 
a670: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a680: 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29  mObj(vcmd, &len)
a690: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
a6a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d     statePtr->vcm
a6b0: 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54  d = vcmd;..    T
a6c0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a6d0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
a6e0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ..}.    }..    i
a6f0: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c  f (model != NULL
a700: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09  ) {..int mode;..
a710: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65  /* Get the "mode
a720: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63  l" context */..c
a730: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
a740: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64  nnel(interp, mod
a750: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20  el, &mode);..if 
a760: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
a770: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
a780: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73 74 61      Tls_Free(sta
a790: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a7a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a7b0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20  }.../*.. * Make 
a7c0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
a7d0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
a7e0: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61  hannel.. */..cha
a7f0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
a800: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66  annel(chan);..if
a810: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
a820: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
a830: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
a840: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a850: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a860: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
a870: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
a880: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 20  lName(chan),... 
a890: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
a8a0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61  S channel", (cha
a8b0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
a8c0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
a8d0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
a8e0: 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  "IMPORT", "CHANN
a8f0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
a900: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
a910: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73 74 61      Tls_Free(sta
a920: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a930: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a940: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a950: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a960: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a970: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a980: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a990: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
a9a0: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
a9b0: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
a9c0: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
a9d0: 72 74 2c 20 28 69 6e 74 29 6b 65 79 5f 6c 65 6e  rt, (int)key_len
a9e0: 2c 0a 09 09 28 69 6e 74 29 63 65 72 74 5f 6c 65  ,...(int)cert_le
a9f0: 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c  n, CApath, CAfil
aa00: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
aa10: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
aa20: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
aa30: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
aa40: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
aa50: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aa60: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
aa70: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
aa80: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f  tx = ctx;..    /
aa90: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64  *.     * We need
aaa0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
aab0: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77  at the channel w
aac0: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28  orks in binary (
aad0: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65  for the.     * e
aae0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f  ncryption not to
aaf0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e   get goofed up).
ab00: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20  .     * We only 
ab10: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74  want to adjust t
ab20: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20  he buffering in 
ab30: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c  pre-v2 channels,
ab40: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61   where.     * ea
ab50: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68  ch channel in th
ab60: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e  e stack maintain
ab70: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65  ed its own buffe
ab80: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  rs..     */.    
ab90: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
aba0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
abb0: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
abc0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
abd0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
abe0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44  king);.    Tcl_D
abf0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
ac00: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
ac10: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
ac20: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
ac30: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
ac40: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
ac50: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
ac60: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  han, "-eofchar",
ac70: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f   &upperChannelEO
ac80: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
ac90: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
aca0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
acb0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70  -encoding", &upp
acc0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
acd0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
ace0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
acf0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
ad00: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65  nslation", &uppe
ad10: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
ad20: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ion);.    Tcl_Ge
ad30: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
ad40: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
ad50: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72  locking", &upper
ad60: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
ad70: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
ad80: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ad90: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
ada0: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79  lation", "binary
adb0: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ");.    Tcl_SetC
adc0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
add0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f  erp, chan, "-blo
ade0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b  cking", "true");
adf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f  .    dprintf("Co
ae00: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e  nsuming Tcl chan
ae10: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  nel %s", Tcl_Get
ae20: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
ae30: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  ));.    statePtr
ae40: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61  ->self = Tcl_Sta
ae50: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
ae60: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  , Tls_ChannelTyp
ae70: 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c 20 28  e(), statePtr, (
ae80: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54  TCL_READABLE | T
ae90: 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68  CL_WRITABLE), ch
aea0: 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  an);.    dprintf
aeb0: 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65  ("Created channe
aec0: 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c  l named %s", Tcl
aed0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
aee0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29  statePtr->self))
aef0: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ;.    if (stateP
af00: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c  tr->self == (Tcl
af10: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
af20: 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65  {../*.. * No use
af30: 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c   of Tcl_Eventual
af40: 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e  lyFree because n
af50: 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50  o possible Tcl_P
af60: 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54  reserve... */..T
af70: 6c 73 5f 46 72 65 65 28 73 74 61 74 65 50 74 72  ls_Free(statePtr
af80: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
af90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
afa0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
afb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
afc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
afd0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63  translation", Tc
afe0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
aff0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
b000: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54  slation));.    T
b010: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
b020: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
b030: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e  ePtr->self, "-en
b040: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  coding", Tcl_DSt
b050: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b060: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
b070: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
b080: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
b090: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
b0a0: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20  lf, "-eofchar", 
b0b0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b0c0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
b0d0: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c  FChar));.    Tcl
b0e0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
b0f0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
b100: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63  tr->self, "-bloc
b110: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69  king", Tcl_DStri
b120: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b130: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b  annelBlocking));
b140: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
b150: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b160: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
b170: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
b180: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b190: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
b1a0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b1b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
b1c0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
b1d0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b1e0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
b1f0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
b200: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61  * SSL Initializa
b210: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  tion.     */.   
b220: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d   statePtr->ssl =
b230: 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74   SSL_new(statePt
b240: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20  r->ctx);.    if 
b250: 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  (!statePtr->ssl)
b260: 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61   {../* SSL libra
b270: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c  ry error */..Tcl
b280: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b290: 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20  terp, "couldn't 
b2a0: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65  construct ssl se
b2b0: 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52  ssion: ", GET_ER
b2c0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b2d0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  r *)NULL);..Tcl_
b2e0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b2f0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b300: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46  ORT", "INIT", "F
b310: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b320: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65  NULL);..Tls_Free
b330: 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74  (statePtr);..ret
b340: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b350: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
b360: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d   host server nam
b370: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72  e */.    if (ser
b380: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53  vername) {../* S
b390: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e  ets the server n
b3a0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
b3b0: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65  SNI) in ClientHe
b3c0: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  llo extension */
b3d0: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36  ../* Per RFC 606
b3e0: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  6, hostname is a
b3f0: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73   ASCII encoded s
b400: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46  tring, though RF
b410: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d  C 4366 says UTF-
b420: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  8. */..if (!SSL_
b430: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
b440: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
b450: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
b460: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
b470: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b480: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
b490: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66   SNI extension f
b4a0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b4b0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b4c0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
b4d0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b4e0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b4f0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c  "IMPORT", "SNI",
b500: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b510: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54   *)NULL);..    T
b520: 6c 73 5f 46 72 65 65 28 73 74 61 74 65 50 74 72  ls_Free(statePtr
b530: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b540: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
b550: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66  * Set hostname f
b560: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63  or peer certific
b570: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72  ate hostname ver
b580: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69  ification in cli
b590: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20  ents...   Don't 
b5a0: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73  use SSL_set1_hos
b5b0: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c  t since it has l
b5c0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09  imitations. */..
b5d0: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f  if (!SSL_add1_ho
b5e0: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  st(statePtr->ssl
b5f0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b  , servername)) {
b600: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b620: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65  Set DNS hostname
b630: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
b640: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b650: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
b660: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b670: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b680: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53  , "IMPORT", "HOS
b690: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22  TNAME", "FAILED"
b6a0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b6b0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73  ..    Tls_Free(s
b6c0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b6d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b6e0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
b6f0: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e  * Resume session
b700: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73   id */.    if (s
b710: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72  ession_id && str
b720: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20  len(session_id) 
b730: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43  <= SSL_MAX_SID_C
b740: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a  TX_LENGTH) {../*
b750: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e   SSL_set_session
b760: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  () */..if (!SSL_
b770: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f  SESSION_set1_id_
b780: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f  context(SSL_get_
b790: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72  session(statePtr
b7a0: 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74  ->ssl),...(const
b7b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b7c0: 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75  ) session_id, (u
b7d0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72  nsigned int) str
b7e0: 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29  len(session_id))
b7f0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
b800: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b810: 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f  , "Resume sessio
b820: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  n failed: ", GET
b830: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b840: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
b850: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b860: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b870: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45  ", "IMPORT", "SE
b880: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22  SSION", "FAILED"
b890: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b8a0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 73  ..    Tls_Free(s
b8b0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b8c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b8d0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
b8e0: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61  * Enable Applica
b8f0: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f  tion-Layer Proto
b900: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
b910: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68   Examples are: h
b920: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31  ttp/1.0,..http/1
b930: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c  .1, h2, h3, ftp,
b940: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70   imap, pop3, xmp
b950: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73  p-client, xmpp-s
b960: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63  erver, mqtt, irc
b970: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66  , etc. */.    if
b980: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f   (alpn) {../* Co
b990: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74  nvert a TCL list
b9a0: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c   into a protocol
b9b0: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f  -list in wire-fo
b9c0: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65  rmat */..unsigne
b9d0: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20  d char *protos, 
b9e0: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  *p;..unsigned in
b9f0: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30  t protos_len = 0
ba00: 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c  ;..Tcl_Size cnt,
ba10: 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c   i;..int j;..Tcl
ba20: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69  _Obj **list;...i
ba30: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
ba40: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
ba50: 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c  , alpn, &cnt, &l
ba60: 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ist) != TCL_OK) 
ba70: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
ba80: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
ba90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
baa0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
bab0: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72  ine the memory r
bac0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
bad0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
bae0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
baf0: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20  < cnt; i++) {.. 
bb00: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
bb10: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c  FromObj(list[i],
bb20: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20   &len);..    if 
bb30: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09  (len > 255) {...
bb40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bb50: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70  (interp, "ALPN p
bb60: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f  rotocol names to
bb70: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a  o long", (char *
bb80: 29 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65  )NULL);...Tcl_Se
bb90: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
bba0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
bbb0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49  T", "ALPN", "FAI
bbc0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  LED", (char *)NU
bbd0: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28  LL);...Tls_Free(
bbe0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
bbf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bc00: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
bc10: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e  s_len += 1 + (in
bc20: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20  t) len;..}.../* 
bc30: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65  Build the comple
bc40: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  te protocol-list
bc50: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b   */..protos = ck
bc60: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e  alloc(protos_len
bc70: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d  );../* protocol-
bc80: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66  lists consist of
bc90: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72   8-bit length-pr
bca0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72  efixed, byte str
bcb0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20  ings */..for (j 
bcc0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b  = 0, p = protos;
bcd0: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b   j < cnt; j++) {
bce0: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20  ..    char *str 
bcf0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
bd00: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20  romObj(list[j], 
bd10: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b  &len);..    *p++
bd20: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
bd30: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d  r) len;..    mem
bd40: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a  cpy(p, str, (siz
bd50: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
bd60: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  p += len;..}.../
bd70: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70  * SSL_set_alpn_p
bd80: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f  rotos makes a co
bd90: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63  py of the protoc
bda0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e  ol-list */../* N
bdb0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ote: This functi
bdc0: 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20  on reverses the 
bdd0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e  return value con
bde0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  vention */..if (
bdf0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
be00: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  tos(statePtr->ss
be10: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f  l, protos, proto
be20: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54  s_len)) {..    T
be30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
be40: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50  interp, "Set ALP
be50: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c  N protocols fail
be60: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
be70: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
be80: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c  )NULL);..    Tcl
be90: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
bea0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
beb0: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22  PORT", "ALPN", "
bec0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
bed0: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73  )NULL);..    Tls
bee0: 5f 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b  _Free(statePtr);
bef0: 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f  ..    ckfree(pro
bf00: 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72  tos);..    retur
bf10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
bf20: 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f  ../* Store proto
bf30: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74  cols list */..st
bf40: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
bf50: 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50   protos;..stateP
bf60: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  tr->protos_len =
bf70: 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20   protos_len;.   
bf80: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65   } else {..state
bf90: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
bfa0: 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  LL;..statePtr->p
bfb0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20  rotos_len = 0;. 
bfc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
bfd0: 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b    * SSL Callback
bfe0: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53  s.     */.    SS
bff0: 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_set_app_data(s
c000: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76  tatePtr->ssl, (v
c010: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c020: 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74  ./* point back t
c030: 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  o us */.    SSL_
c040: 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65  set_verify(state
c050: 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79  Ptr->ssl, verify
c060: 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  , VerifyCallback
c070: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69  );.    SSL_set_i
c080: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  nfo_callback(sta
c090: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f  tePtr->ssl, Info
c0a0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
c0b0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  /* Callback for 
c0c0: 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63  observing protoc
c0d0: 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23  ol messages */.#
c0e0: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  ifndef OPENSSL_N
c0f0: 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20  O_SSL_TRACE.    
c100: 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f  /* void SSL_CTX_
c110: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c120: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
c130: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c140: 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20  ePtr);.    void 
c150: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
c160: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c170: 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43  r->ctx, MessageC
c180: 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20  allback); */.   
c190: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
c1a0: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50  lback_arg(stateP
c1b0: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
c1c0: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  )statePtr);.    
c1d0: 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  SSL_set_msg_call
c1e0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
c1f0: 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  sl, MessageCallb
c200: 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ack);.#endif..  
c210: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f    /* Create Tcl_
c220: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64  Channel BIO Hand
c230: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ler */.    state
c240: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f  Ptr->p_bio.= BIO
c250: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74  _new_tcl(statePt
c260: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  r, BIO_NOCLOSE);
c270: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62  .    statePtr->b
c280: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f  io.= BIO_new(BIO
c290: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20  _f_ssl());..    
c2a0: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f  if (server) {../
c2b0: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63  * Server callbac
c2c0: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ks */..SSL_CTX_s
c2d0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
c2e0: 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74  name_arg(statePt
c2f0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
c300: 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f  statePtr);..SSL_
c310: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73  CTX_set_tlsext_s
c320: 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61  ervername_callba
c330: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ck(statePtr->ctx
c340: 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a  , SNICallback);.
c350: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
c360: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61  ent_hello_cb(sta
c370: 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c  tePtr->ctx, Hell
c380: 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
c390: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69   *)statePtr);..i
c3a0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
c3b0: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tos != NULL) {..
c3c0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c3d0: 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73  alpn_select_cb(s
c3e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c  tatePtr->ctx, AL
c3f0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  PNCallback, (voi
c400: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23  d *)statePtr);.#
c410: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20  ifdef USE_NPN.. 
c420: 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d     if (tls1_2 ==
c430: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20   0 && tls1_3 == 
c440: 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73  0) {...SSL_CTX_s
c450: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61  et_next_protos_a
c460: 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61  dvertised_cb(sta
c470: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43  tePtr->ctx, NPNC
c480: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c490: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
c4a0: 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f   }.#endif..}.../
c4b0: 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20  * Enable server 
c4c0: 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71  to send cert req
c4d0: 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73  uest after hands
c4e0: 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e  hake (TLS 1.3 on
c4f0: 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69  ly) */../* A wri
c500: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73  te operation mus
c510: 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72  t take place for
c520: 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65   the Certificate
c530: 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09   Request to be..
c540: 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63     sent to the c
c550: 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20  lient, this can 
c560: 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c  be done with SSL
c570: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e  _do_handshake().
c580: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
c590: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
c5a0: 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a  ke && tls1_3) {.
c5b0: 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f  .    SSL_verify_
c5c0: 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64  client_post_hand
c5d0: 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e  shake(statePtr->
c5e0: 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65  ssl);..}.../* se
c5f0: 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76  t automatic curv
c600: 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09  e selection */..
c610: 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74  SSL_set_ecdh_aut
c620: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
c630: 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65   1);.../* Set se
c640: 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74  rver mode */..st
c650: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
c660: 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b   TLS_TCL_SERVER;
c670: 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74  ..SSL_set_accept
c680: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
c690: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
c6a0: 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63  e {../* Client c
c6b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64  allbacks */.#ifd
c6c0: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28  ef USE_NPN..if (
c6d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c6e0: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31   != NULL && tls1
c6f0: 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f  _2 == 0 && tls1_
c700: 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53  3 == 0) {..    S
c710: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f  SL_CTX_set_next_
c720: 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28  proto_select_cb(
c730: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41  statePtr->ctx, A
c740: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  LPNCallback, (vo
c750: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c760: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53  .}.#endif.../* S
c770: 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a  ession caching *
c780: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
c790: 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
c7a0: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  e(statePtr->ctx,
c7b0: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
c7c0: 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53  CLIENT | SSL_SES
c7d0: 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52  S_CACHE_NO_INTER
c7e0: 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c  NAL_STORE);..SSL
c7f0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65  _CTX_sess_set_ne
c800: 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  w_cb(statePtr->c
c810: 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62  tx, SessionCallb
c820: 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c  ack);.../* Enabl
c830: 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65  e post handshake
c840: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
c850: 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31  extension. TLS 1
c860: 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74  .3 only, not htt
c870: 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71  p/2. */..if (req
c880: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
c890: 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53  dshake) {..    S
c8a0: 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64  SL_set_post_hand
c8b0: 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65  shake_auth(state
c8c0: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d  Ptr->ssl, 1);..}
c8d0: 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74  .../* Set client
c8e0: 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65   mode */..SSL_se
c8f0: 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28  t_connect_state(
c900: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
c910: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65      }.    SSL_se
c920: 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e  t_bio(statePtr->
c930: 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  ssl, statePtr->p
c940: 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e  _bio, statePtr->
c950: 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f  p_bio);.    BIO_
c960: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72  set_ssl(statePtr
c970: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  ->bio, statePtr-
c980: 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53  >ssl, BIO_NOCLOS
c990: 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  E);..    /*.    
c9a0: 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e   * End of SSL In
c9b0: 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64  it.     */.    d
c9c0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
c9d0: 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  g %s", Tcl_GetCh
c9e0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
c9f0: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20  tr->self));.    
ca00: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
ca10: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63  terp, (char *)Tc
ca20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
ca30: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
ca40: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
ca50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ca60: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cab0: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f  . *. * UnimportO
cac0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
cad0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
cae0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f   invoked to remo
caf0: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  ve the topmost c
cb00: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20  hannel filter.. 
cb10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
cb20: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
cb30: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
cb40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
cb50: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
cb60: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
cb70: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
cbd0: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  t.UnimportObjCmd
cbe0: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  (.    TCL_UNUSED
cbf0: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63  (void *),.    Tc
cc00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
cc10: 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  ,.    int objc,.
cc20: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
cc30: 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20  st objv[]).{.   
cc40: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
cc50: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
cc60: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
cc70: 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72   on. */..    dpr
cc80: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
cc90: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
cca0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
ccb0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ccc0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
ccd0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
cce0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ccf0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
cd00: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
cd10: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
cd20: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
cd30: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
cd40: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
cd50: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
cd60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cd70: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
cd80: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
cd90: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
cda0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
cdb0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
cdc0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69  el(chan);..    i
cdd0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
cde0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
cdf0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
ce00: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
ce10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
ce20: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
ce30: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
ce40: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
ce50: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
ce60: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  el", (char *)NUL
ce70: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
ce80: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
ce90: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c  LS", "UNIMPORT",
cea0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
ceb0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e  ALID", (char *)N
cec0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
ced0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cee0: 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74      if (Tcl_Unst
cef0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
cf00: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f  p, chan) == TCL_
cf10: 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e  ERROR) {..return
cf20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cf30: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  }..    return TC
cf40: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf90: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69  --. *. * CTX_Ini
cfa0: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61  t -- construct a
cfb0: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63   SSL_CTX instanc
cfc0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  e. *. * Results:
cfd0: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f  . *.A valid SSL_
cfe0: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20  CTX instance or 
cff0: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  NULL.. *. * Side
d000: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e   effects:. *.con
d010: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74  structs SSL cont
d020: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d070: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53  --. */..static S
d080: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69  SL_CTX *.CTX_Ini
d090: 74 28 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  t(.    State *st
d0a0: 61 74 65 50 74 72 2c 0a 20 20 20 20 69 6e 74 20  atePtr,.    int 
d0b0: 69 73 53 65 72 76 65 72 2c 0a 20 20 20 20 69 6e  isServer,.    in
d0c0: 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20 63 68 61  t proto,.    cha
d0d0: 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20 20 20 20  r *keyfile,.    
d0e0: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
d0f0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
d100: 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75 6e 73 69  r *key,.    unsi
d110: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c  gned char *cert,
d120: 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e  .    int key_len
d130: 2c 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c  ,.    int cert_l
d140: 65 6e 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41  en,.    char *CA
d150: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a  path,.    char *
d160: 43 41 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72  CAfile,.    char
d170: 20 2a 63 69 70 68 65 72 73 2c 0a 20 20 20 20 63   *ciphers,.    c
d180: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
d190: 73 2c 0a 20 20 20 20 69 6e 74 20 6c 65 76 65 6c  s,.    int level
d1a0: 2c 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61  ,.    char *DHpa
d1b0: 72 61 6d 73 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  rams).{.    Tcl_
d1c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
d1d0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
d1e0: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  p;.    SSL_CTX *
d1f0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
d200: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
d210: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c      int off = 0,
d220: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   abort = 0;.    
d230: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65  int load_private
d240: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  _key;.    const 
d250: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68  SSL_METHOD *meth
d260: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  od;..    dprintf
d270: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
d280: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09   if (!proto) {..
d290: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d2a0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c  (interp, "no val
d2b0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  id protocol sele
d2c0: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e  cted", (char *)N
d2d0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d2e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
d2f0: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e  * create SSL con
d300: 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  text */.#if OPEN
d310: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
d320: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30  ER >= 0x10100000
d330: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f  L || defined(NO_
d340: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL2) || defined
d350: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
d360: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d370: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d380: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c  TO_SSL2)) {..Tcl
d390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d3a0: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74  terp, "SSL2 prot
d3b0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d3c0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ed", (char *)NUL
d3d0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d3e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d3f0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
d400: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
d410: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a  PENSSL_NO_SSL3).
d420: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d430: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d440: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41  _SSL3)) {..Tcl_A
d450: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d460: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63  rp, "SSL3 protoc
d470: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d480: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
d490: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d4a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d4b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d4c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d4d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
d4e0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d4f0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
d500: 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  LS1)) {..Tcl_App
d510: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d520: 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f  , "TLS 1.0 proto
d530: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d540: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
d550: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d560: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d570: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d580: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
d590: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d5a0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
d5b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d5c0: 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09  OTO_TLS1_1)) {..
d5d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d5e0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
d5f0: 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  1 protocol not s
d600: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
d610: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72   *)NULL);..retur
d620: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d630: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d640: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
d650: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d660: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66  O_TLS1_2).    if
d670: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d690: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
d6a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d6b0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
d6c0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d6d0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
d6e0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d6f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
d700: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
d710: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
d720: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
d730: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d740: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d750: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63  O_TLS1_3)) {..Tc
d760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d770: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20  nterp, "TLS 1.3 
d780: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d790: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d7a0: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
d7b0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d7c0: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  if.    if (proto
d7d0: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65   == 0) {../* Use
d7e0: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09   full range */..
d7f0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
d800: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
d810: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  x, 0);..SSL_CTX_
d820: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
d830: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20  rsion(ctx, 0);. 
d840: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
d850: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f   (proto) {.#if O
d860: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
d870: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
d880: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
d890: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
d8a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d8b0: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54  SSL2).    case T
d8c0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09  LS_PROTO_SSL2:..
d8d0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d8e0: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72  r ? SSLv2_server
d8f0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
d900: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
d910: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d920: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d930: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
d940: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d950: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
d960: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d970: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
d980: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
d990: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
d9a0: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72  rver ? SSLv3_ser
d9b0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
d9c0: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv3_client_meth
d9d0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d9e0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d9f0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
da00: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
da10: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
da20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
da30: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
da40: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
da50: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  LS1:..method = i
da60: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
da70: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
da80: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d  : TLSv1_client_m
da90: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
daa0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dab0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
dac0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dad0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
dae0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
daf0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
db00: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
db10: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
db20: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
db30: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72  er ? TLSv1_1_ser
db40: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
db50: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_1_client_me
db60: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
db70: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
db80: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
db90: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dba0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
dbb0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dbc0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
dbd0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
dbe0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09  _PROTO_TLS1_2:..
dbf0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
dc00: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76  r ? TLSv1_2_serv
dc10: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
dc20: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_2_client_met
dc30: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
dc40: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
dc50: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
dc60: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dc70: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
dc80: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
dc90: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20  TLS1_3:../* Use 
dca0: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68  the generic meth
dcb0: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  od and constrain
dcc0: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f  t range after co
dcd0: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64  ntext is created
dce0: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
dcf0: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
dd00: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
dd10: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
dd20: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
dd30: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
dd40: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
dd50: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
dd60: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
dd70: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
dd80: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
dd90: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
dda0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
ddb0: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
ddc0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
ddd0: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
dde0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
ddf0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
de00: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f  NSSL_NO_SSL2)..o
de10: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
de20: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
de30: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53  SSL2)   ? 0 : SS
de40: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a  L_OP_NO_SSLv2);.
de50: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
de60: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
de70: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
de80: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c  _NO_SSL3)..off |
de90: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
dea0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
deb0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
dec0: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64  _NO_SSLv3);.#end
ded0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
dee0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
def0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
df00: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  TLS1)..off |= (E
df10: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
df20: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
df30: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
df40: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
df50: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
df60: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
df70: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
df80: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_1)..off |= (E
df90: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dfa0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
dfb0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
dfc0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
dfd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dfe0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
dff0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e000: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_2)..off |= 
e010: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e020: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
e030: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e040: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64  O_TLSv1_2);.#end
e050: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e060: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e070: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e080: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c  O_TLS1_3)..off |
e090: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e0a0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
e0b0: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _3) ? 0 : SSL_OP
e0c0: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65  _NO_TLSv1_3);.#e
e0d0: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ndif..break;.   
e0e0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
e0f0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
e100: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
e110: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
e120: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75  f (!ctx) {..retu
e130: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
e140: 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53      if (getenv(S
e150: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b  SLKEYLOGFILE)) {
e160: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65  ..SSL_CTX_set_ke
e170: 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74  ylog_callback(ct
e180: 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63  x, KeyLogCallbac
e190: 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  k);.    }..#if !
e1a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
e1b0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
e1c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
e1d0: 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20  ).    if (proto 
e1e0: 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  == TLS_PROTO_TLS
e1f0: 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  1_3) {..SSL_CTX_
e200: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
e210: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
e220: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c  3_VERSION);..SSL
e230: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
e240: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
e250: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
e260: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
e270: 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68     /* Force ciph
e280: 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64  er selection ord
e290: 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a  er by server */.
e2a0: 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65      if (!isServe
e2b0: 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  r) {..SSL_CTX_se
e2c0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
e2d0: 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52  SL_OP_CIPHER_SER
e2e0: 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b  VER_PREFERENCE);
e2f0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e  .    }..#if OPEN
e300: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
e310: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
e320: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64  .    OpenSSL_add
e330: 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28  _all_algorithms(
e340: 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65  ); /* Load ciphe
e350: 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a  rs and digests *
e360: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53  /.#endif..    SS
e370: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61  L_CTX_set_app_da
e380: 74 61 28 63 74 78 2c 20 69 6e 74 65 72 70 29 3b  ta(ctx, interp);
e390: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65  ./* remember the
e3a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
e3b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e3c0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
e3d0: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c  _OP_ALL);./* all
e3e0: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f   SSL bug workaro
e3f0: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  unds */.    SSL_
e400: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
e410: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43  ctx, SSL_OP_NO_C
e420: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20  OMPRESSION);./* 
e430: 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73  disable compress
e440: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70  ion even if supp
e450: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c  orted */.    SSL
e460: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e470: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20  (ctx, off);../* 
e480: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  disable protocol
e490: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66   versions */.#if
e4a0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
e4b0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
e4c0: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54  1000L.    SSL_CT
e4d0: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20  X_set_mode(ctx, 
e4e0: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45  SSL_MODE_AUTO_RE
e4f0: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20  TRY);./* handle 
e500: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69  new handshakes i
e510: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e  n background. On
e520: 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f   by default in O
e530: 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f  penSSL 1.1.1. */
e540: 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f  .#endif.    SSL_
e550: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63  CTX_sess_set_cac
e560: 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38  he_size(ctx, 128
e570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  );..    /* Set u
e580: 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68  ser defined ciph
e590: 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74  ers, cipher suit
e5a0: 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79  es, and security
e5b0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
e5c0: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55   ((ciphers != NU
e5d0: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f  LL) && !SSL_CTX_
e5e0: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28  set_cipher_list(
e5f0: 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b  ctx, ciphers)) {
e600: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e610: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
e620: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20  ciphers failed: 
e630: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
e640: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
e650: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e660: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e670: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
e680: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20   ((ciphersuites 
e690: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c  != NULL) && !SSL
e6a0: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73  _CTX_set_ciphers
e6b0: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65  uites(ctx, ciphe
e6c0: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c  rsuites)) {..Tcl
e6d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e6e0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65  terp, "Set ciphe
e6f0: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a  r suites failed:
e700: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
e710: 73 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  s", (char *)NULL
e720: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e730: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e740: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
e750: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20  /* Set security 
e760: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
e770: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c  (level > -1 && l
e780: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20  evel < 6) {../* 
e790: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79  SSL_set_security
e7a0: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43  _level */..SSL_C
e7b0: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  TX_set_security_
e7c0: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c  level(ctx, level
e7d0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e7e0: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
e7f0: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
e800: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
e810: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
e820: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
e830: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e840: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e850: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c  cb_userdata(ctx,
e860: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
e870: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64  r);..    /* read
e880: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61   a Diffie-Hellma
e890: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  n parameters fil
e8a0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75  e, or use the bu
e8b0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20  ilt-in one */.  
e8c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
e8d0: 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66 20 4f  t(&ds);.#ifdef O
e8e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20  PENSSL_NO_DH.   
e8f0: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d   if (DHparams !=
e900: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
e910: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e920: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72  p, "DH parameter
e930: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61   support not ava
e940: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a  ilable", (char *
e950: 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58  )NULL);..SSL_CTX
e960: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
e970: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
e980: 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a  #else.    {..DH*
e990: 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61   dh;..if (DHpara
e9a0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ms != NULL) {.. 
e9b0: 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20     BIO *bio;... 
e9c0: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77     bio = BIO_new
e9d0: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61  _file(F2N(DHpara
e9e0: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a  ms, &ds), "r");.
e9f0: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b  .    if (!bio) {
ea00: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
ea10: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41  ee(&ds);...Tcl_A
ea20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ea30: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66  rp, "Could not f
ea40: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72  ind DH parameter
ea50: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  s file", (char *
ea60: 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54  )NULL);...SSL_CT
ea70: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
ea80: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
ea90: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45   }...    dh = PE
eaa0: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72  M_read_bio_DHpar
eab0: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e  ams(bio, NULL, N
eac0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ULL, NULL);..   
ead0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a   BIO_free(bio);.
eae0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
eaf0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
eb00: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c  if (!dh) {...Tcl
eb10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eb20: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
eb30: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74   read DH paramet
eb40: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20  ers from file", 
eb50: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
eb60: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
eb70: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
eb80: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53  L;..    }..    S
eb90: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64  SL_CTX_set_tmp_d
eba0: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20  h(ctx, dh);..   
ebb0: 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 09 7d   DH_free(dh);..}
ebc0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20   else {..    /* 
ebd0: 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44  Use well known D
ebe0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  H parameters tha
ebf0: 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20  t have built-in 
ec00: 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53  support in OpenS
ec10: 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21  SL */..    if (!
ec20: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61  SSL_CTX_set_dh_a
ec30: 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09  uto(ctx, 1)) {..
ec40: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
ec50: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
ec60: 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20   not enable set 
ec70: 44 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f  DH auto: ", GET_
ec80: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
ec90: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53  har *)NULL);...S
eca0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ecb0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
ecc0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
ecd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
ece0: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63  set our certific
ecf0: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f  ate */.    load_
ed00: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b  private_key = 0;
ed10: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
ed20: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  e != NULL) {..lo
ed30: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
ed40: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54   1;...if (SSL_CT
ed50: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
ed60: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
ed70: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
ed80: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
ed90: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
eda0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
edb0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
edc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
edd0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
ede0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
edf0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
ee00: 22 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f  ": ",...    GET_
ee10: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
ee20: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
ee30: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
ee40: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
ee50: 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44   NULL;..}..Tcl_D
ee60: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ee70: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
ee80: 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (cert != NULL) {
ee90: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  ..load_private_k
eea0: 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c  ey = 1;..if (SSL
eeb0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
eec0: 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63  cate_ASN1(ctx, c
eed0: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c  ert_len, cert) <
eee0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
eef0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ef00: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
ef10: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
ef20: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52   ",...    GET_ER
ef30: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
ef40: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
ef50: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
ef60: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
ef70: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
ef80: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d  se {..certfile =
ef90: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74   (char*)X509_get
efa0: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69  _default_cert_fi
efb0: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  le();...if (SSL_
efc0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
efd0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
efe0: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  rtfile, SSL_FILE
eff0: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
f000: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
f010: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f020: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
f030: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72   use default cer
f040: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
f050: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c   certfile, ": ",
f060: 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52  ...    GET_ERR_R
f070: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
f080: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c  )NULL);..    SSL
f090: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f0a0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
f0b0: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20  ;.#endif..}.    
f0c0: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  }..    /* set ou
f0d0: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f  r private key */
f0e0: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72  .    if (load_pr
f0f0: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66  ivate_key) {..if
f100: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
f110: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c  L && key == NULL
f120: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65  ) {..    keyfile
f130: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a   = certfile;..}.
f140: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d  ..if (keyfile !=
f150: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
f160: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65   get the private
f170: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
f180: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66  with this certif
f190: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66  icate */..    if
f1a0: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
f1b0: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d  L) {...keyfile =
f1c0: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20   certfile;..    
f1d0: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f  }...    if (SSL_
f1e0: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
f1f0: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  ey_file(ctx, F2N
f200: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20  (keyfile, &ds), 
f210: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
f220: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  ) <= 0) {...Tcl_
f230: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f240: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  ;.../* flush the
f250: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
f260: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
f270: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
f280: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
f290: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
f2a0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
f2b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f2c0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
f2d0: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
f2e0: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65   file ", keyfile
f2f0: 2c 20 22 20 22 2c 0a 09 09 09 47 45 54 5f 45 52  , " ",....GET_ER
f300: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
f310: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c  r *)NULL);...SSL
f320: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f330: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
f340: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
f350: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f360: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79  ..} else if (key
f370: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
f380: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
f390: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31  _PrivateKey_ASN1
f3a0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63  (EVP_PKEY_RSA, c
f3b0: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29  tx, key,key_len)
f3c0: 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c   <= 0) {.../* fl
f3d0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
f3e0: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
f3f0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
f400: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
f410: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
f420: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
f430: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
f440: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
f450: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
f460: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f  lic key: ", GET_
f470: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
f480: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53  har *)NULL);...S
f490: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f4a0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
f4b0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e  ..    }..}../* N
f4c0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ow we know that 
f4d0: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68  a key and cert h
f4e0: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61  ave been set aga
f4f0: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c  inst.. * the SSL
f500: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20   context */..if 
f510: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f  (!SSL_CTX_check_
f520: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29  private_key(ctx)
f530: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
f540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f550: 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64  , "private key d
f560: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
f570: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75  e certificate pu
f580: 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20  blic key",....  
f590: 20 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29     (char *)NULL)
f5a0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
f5b0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
f5c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eturn NULL;..}. 
f5d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
f5e0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
f5f0: 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c  location and fil
f600: 65 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74  e for Certificat
f610: 65 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29  e Authority (CA)
f620: 20 63 65 72 74 69 66 69 63 61 74 65 73 2e 20 54   certificates. T
f630: 68 65 0a 20 20 20 20 20 2a 20 76 65 72 69 66 79  he.     * verify
f640: 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20   path and store 
f650: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
f660: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
f670: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54  T_DIR env var. T
f680: 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 63  he verify file c
f690: 61 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 65  an.     * be ove
f6a0: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
f6b0: 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76  SL_CERT_FILE env
f6c0: 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20   var. */.    if 
f6d0: 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  (!SSL_CTX_set_de
f6e0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74  fault_verify_pat
f6f0: 68 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72  hs(ctx)) {..abor
f700: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  t++;.    }..    
f710: 2f 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72  /* Overrides for
f720: 20 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70   the CA verify p
f730: 61 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a  ath and file */.
f740: 20 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53      {.#if OPENSS
f750: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
f760: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
f770: 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55  if (CApath != NU
f780: 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20  LL || CAfile != 
f790: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
f7a0: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20  _DString ds1;.. 
f7b0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
f7c0: 69 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20  it(&ds1);...    
f7d0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
f7e0: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f  d_verify_locatio
f7f0: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69  ns(ctx, F2N(CAfi
f800: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41  le, &ds), F2N(CA
f810: 70 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a  path, &ds1))) {.
f820: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20  ..abort++;..    
f830: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
f840: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
f850: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
f860: 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f  e(&ds1);...    /
f870: 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41  * Set list of CA
f880: 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69  s to send to cli
f890: 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74  ent when request
f8a0: 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72  ing a client cer
f8b0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
f8c0: 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72   /* https://sour
f8d0: 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c  ceforge.net/p/tl
f8e0: 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20  s/bugs/57/ */.. 
f8f0: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20     /* XXX:TODO: 
f900: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70  Let the user sup
f910: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20  ply values here 
f920: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74  instead of somet
f930: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73  hing that exists
f940: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   on the filesyst
f950: 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b  em */..    STACK
f960: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a  _OF(X509_NAME) *
f970: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f  certNames = SSL_
f980: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66  load_client_CA_f
f990: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20  ile(F2N(CAfile, 
f9a0: 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28  &ds));..    if (
f9b0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c  certNames != NUL
f9c0: 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73  L) {...SSL_CTX_s
f9d0: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
f9e0: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73  t(ctx, certNames
f9f0: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  );..    }..    T
fa00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
fa10: 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09  ds);..}..#else..
fa20: 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55  if (CApath != NU
fa30: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21  LL) {..    if (!
fa40: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
fa50: 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e  ify_dir(ctx, F2N
fa60: 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20  (CApath, &ds))) 
fa70: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20  {...abort++;..  
fa80: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
fa90: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
faa0: 7d 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d  }..if (CAfile !=
fab0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66   NULL) {..    if
fac0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f   (!SSL_CTX_load_
fad0: 76 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c  verify_file(ctx,
fae0: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73   F2N(CAfile, &ds
faf0: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b  ))) {...abort++;
fb00: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
fb10: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
fb20: 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20  );...    /* Set 
fb30: 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73  list of CAs to s
fb40: 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68  end to client wh
fb50: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  en requesting a 
fb60: 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61  client certifica
fb70: 74 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b  te */..    STACK
fb80: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a  _OF(X509_NAME) *
fb90: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f  certNames = SSL_
fba0: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66  load_client_CA_f
fbb0: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20  ile(F2N(CAfile, 
fbc0: 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28  &ds));..    if (
fbd0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c  certNames != NUL
fbe0: 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73  L) {...SSL_CTX_s
fbf0: 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
fc00: 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73  t(ctx, certNames
fc10: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  );..    }..    T
fc20: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
fc30: 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20  ds);..}.#endif. 
fc40: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
fc50: 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   ctx;.}.../*. *-
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fca0: 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f  --. *. * StatusO
fcb0: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
fcc0: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20  certificate for 
fcd0: 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a  connected peer..
fce0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
fcf0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
fd00: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
fd10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
fd20: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
fd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
fd70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74  */.static int.St
fd80: 61 74 75 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20  atusObjCmd(.    
fd90: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20  TCL_UNUSED(void 
fda0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  *),.    Tcl_Inte
fdb0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20  rp *interp,.    
fdc0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63  int objc,.    Tc
fdd0: 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj.*const obj
fde0: 76 5b 5d 29 0a 7b 0a 20 20 20 20 53 74 61 74 65  v[]).{.    State
fdf0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
fe00: 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20  X509 *peer;.    
fe10: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
fe20: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
fe30: 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20   chan;.    char 
fe40: 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63  *channelName, *c
fe50: 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20  iphers;.    int 
fe60: 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  mode;.    const 
fe70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
fe80: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e  roto;.    unsign
fe90: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20  ed int len;.    
fea0: 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20  int nid, res;.. 
feb0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
fec0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
fed0: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20  bjc < 2 || objc 
fee0: 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20  > 3 || (objc == 
fef0: 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c  3 && !strcmp(Tcl
ff00: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ff10: 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29  1]), "-local")))
ff20: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
ff30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
ff40: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20  objv, "?-local? 
ff50: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
ff60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ff70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
ff80: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20  channel Id */.  
ff90: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20    channelName = 
ffa0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ffb0: 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20  jv[(objc == 2 ? 
ffc0: 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68  1 : 2)]);.    ch
ffd0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
ffe0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
fff0: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b  nelName, &mode);
10000 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
10010 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
10020 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
10030 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10040 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
10050 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
10060 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
10070 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
10080 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
10090 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
100a0 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
100b0 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
100c0 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
100d0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
100e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
100f0 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
10100 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
10110 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
10120 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
10130 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  el", (char *)NUL
10140 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
10150 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
10160 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
10170 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
10180 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ID", (char *)NUL
10190 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
101a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
101b0 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
101c0 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  te *) Tcl_GetCha
101d0 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
101e0 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  (chan);..    /* 
101f0 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  Get certificate 
10200 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66  for peer or self
10210 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
10220 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d   == 2) {..peer =
10230 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65   SSL_get_peer_ce
10240 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
10250 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20  tr->ssl);.    } 
10260 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53  else {..peer = S
10270 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61  SL_get_certifica
10280 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
10290 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
102a0 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69  Get X509 certifi
102b0 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  cate info */.   
102c0 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62   if (peer) {..ob
102d0 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35  jPtr = Tls_NewX5
102e0 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65  09Obj(interp, pe
102f0 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d  er);..if (objc =
10300 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39  = 2) {..    X509
10310 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20  _free(peer);..  
10320 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09    peer = NULL;..
10330 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
10340 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
10350 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
10360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10370 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  Peer name */.   
10380 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
10390 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65  erp, objPtr, "pe
103a0 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74  ername", SSL_get
103b0 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65  0_peername(state
103c0 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a  Ptr->ssl), -1);.
103d0 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
103e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
103f0 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74  "sbits", SSL_get
10400 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61  _cipher_bits(sta
10410 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c  tePtr->ssl, NULL
10420 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73  ));..    ciphers
10430 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65   = (char*)SSL_ge
10440 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74  t_cipher(statePt
10450 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50  r->ssl);.    LAP
10460 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10470 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
10480 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b  ", ciphers, -1);
10490 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
104a0 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69  the X509 certifi
104b0 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62  cate presented b
104c0 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20  y the peer */.  
104d0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
104e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76  terp, objPtr, "v
104f0 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58  erifyResult",..X
10500 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f  509_verify_cert_
10510 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c  error_string(SSL
10520 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75  _get_verify_resu
10530 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  lt(statePtr->ssl
10540 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  )), -1);..    /*
10550 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a   Verify mode */.
10560 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67      mode = SSL_g
10570 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73  et_verify_mode(s
10580 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
10590 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53     if (mode && S
105a0 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20  SL_VERIFY_NONE) 
105b0 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  {..LAPPEND_STR(i
105c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
105d0 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f  verifyMode", "no
105e0 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20  ne", -1);.    } 
105f0 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  else {..Tcl_Obj 
10600 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63  *listObjPtr = Tc
10610 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
10620 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65  NULL);..if (mode
10630 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   && SSL_VERIFY_P
10640 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  EER) {..    Tcl_
10650 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10660 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10670 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10680 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22  StringObj("peer"
10690 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
106a0 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
106b0 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
106c0 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20  ER_CERT) {..    
106d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
106e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
106f0 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
10700 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66  _NewStringObj("f
10710 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63  ail if no peer c
10720 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ert", -1));..}..
10730 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10740 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e  VERIFY_CLIENT_ON
10750 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  CE) {..    Tcl_L
10760 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10770 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
10780 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
10790 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74  tringObj("client
107a0 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d   once", -1));..}
107b0 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
107c0 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41  L_VERIFY_POST_HA
107d0 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20  NDSHAKE) {..    
107e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
107f0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10800 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
10810 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
10820 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20  ost handshake", 
10830 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e  -1));..}..LAPPEN
10840 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62  D_OBJ(interp, ob
10850 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64  jPtr, "verifyMod
10860 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a  e", listObjPtr).
10870 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65      }..    /* Ve
10880 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20  rify mode depth 
10890 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  */.    LAPPEND_I
108a0 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
108b0 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22  r, "verifyDepth"
108c0 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  , SSL_get_verify
108d0 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d  _depth(statePtr-
108e0 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  >ssl));..    /* 
108f0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
10900 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
10910 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
10920 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20  negotiation */. 
10930 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e     SSL_get0_alpn
10940 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50  _selected(stateP
10950 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  tr->ssl, &proto,
10960 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50   &len);.    LAPP
10970 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10980 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
10990 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28  (char *)proto, (
109a0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a  Tcl_Size) len);.
109b0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
109c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
109d0 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f  "protocol", SSL_
109e0 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74  get_version(stat
109f0 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
10a00 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66  ..    /* Valid f
10a10 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61  or non-RSA signa
10a20 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33  ture and TLS 1.3
10a30 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
10a40 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20   == 2) {..res = 
10a50 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67  SSL_get_peer_sig
10a60 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65  nature_nid(state
10a70 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
10a80 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
10a90 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67  es = SSL_get_sig
10aa0 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65  nature_nid(state
10ab0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
10ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
10ad0 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a  res) {nid = 0;}.
10ae0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
10af0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10b00 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c  "signatureHashAl
10b10 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69  gorithm", OBJ_ni
10b20 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a  d2ln(nid), -1);.
10b30 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
10b40 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
10b50 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
10b60 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61  ure_type_nid(sta
10b70 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
10b80 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
10b90 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73  .res = SSL_get_s
10ba0 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69  ignature_type_ni
10bb0 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10bc0 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20   &nid);.    }.  
10bd0 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64    if (!res) {nid
10be0 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45   = 0;}.    LAPPE
10bf0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10c00 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72  bjPtr, "signatur
10c10 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32  eType", OBJ_nid2
10c20 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20  ln(nid), -1);.. 
10c30 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
10c40 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
10c50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
10c60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
10c70 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10cb0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65  ----. *. * Conne
10cc0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20  ctionInfoObjCmd 
10cd0 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63  -- return connec
10ce0 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f  tion info from O
10cf0 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
10d00 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74  sults:. *.A list
10d10 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   of connection i
10d20 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nfo.  *. *------
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 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f  /..static int Co
10d80 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
10d90 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
10da0 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
10db0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10dc0 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
10dd0 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ,.    Tcl_Obj *c
10de0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20  onst objv[]).{. 
10df0 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
10e00 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
10e10 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
10e20 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61  de on */.    Sta
10e30 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
10e40 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
10e50 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
10e60 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
10e70 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a  jPtr, *listPtr;.
10e80 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73      const SSL *s
10e90 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  sl;.    const SS
10ea0 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  L_CIPHER *cipher
10eb0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
10ec0 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
10ed0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
10ee0 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20  MD *md;..    if 
10ef0 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
10f00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10f10 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10f20 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
10f30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10f40 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
10f50 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
10f60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10f70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10f80 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
10f90 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
10fa0 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
10fb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10fc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
10fd0 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
10fe0 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
10ff0 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
11000 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
11010 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
11020 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
11030 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
11040 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
11050 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
11060 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11070 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
11080 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
11090 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
110a0 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61  ..    "\": not a
110b0 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
110c0 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54  char *)NULL);..T
110d0 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
110e0 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
110f0 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48  CONNECTION", "CH
11100 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
11110 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
11120 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
11130 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
11140 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
11150 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
11160 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;..    /* Connec
11170 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  tion info */.   
11180 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
11190 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
111a0 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
111b0 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d  chan);.    ssl =
111c0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a   statePtr->ssl;.
111d0 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e      if (ssl != N
111e0 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65  ULL) {../* conne
111f0 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09  ction state */..
11200 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11210 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
11220 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73  te", SSL_state_s
11230 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c  tring_long(ssl),
11240 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53   -1);.../* Get S
11250 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72  NI requested ser
11260 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50  ver name */..LAP
11270 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11280 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72   objPtr, "server
11290 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73  name", SSL_get_s
112a0 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54  ervername(ssl, T
112b0 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
112c0 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a  ost_name), -1);.
112d0 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f  ../* Get protoco
112e0 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l */..LAPPEND_ST
112f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11300 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53  , "protocol", SS
11310 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73  L_get_version(ss
11320 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65  l), -1);.../* Re
11330 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f  negotiation allo
11340 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  wed */..LAPPEND_
11350 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
11360 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74  Ptr, "renegotiat
11370 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53  ion_allowed", SS
11380 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e  L_get_secure_ren
11390 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f  egotiation_suppo
113a0 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29  rt((SSL *) ssl))
113b0 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72  ;.../* Get secur
113c0 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41  ity level */..LA
113d0 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
113e0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72  , objPtr, "secur
113f0 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f  ity_level", SSL_
11400 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  get_security_lev
11410 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53  el(ssl));.../* S
11420 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09  ession info */..
11430 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
11440 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11450 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53  ssion_reused", S
11460 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65  SL_session_reuse
11470 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  d(ssl));.../* Is
11480 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   server info */.
11490 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
114a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69  terp, objPtr, "i
114b0 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69  s_server", SSL_i
114c0 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a  s_server(ssl));.
114d0 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a  ../* Is DTLS */.
114e0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
114f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69  terp, objPtr, "i
11500 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f  s_dtls", SSL_is_
11510 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20  dtls(ssl));.    
11520 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72  }..    /* Cipher
11530 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70   info */.    cip
11540 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  her = SSL_get_cu
11550 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c  rrent_cipher(ssl
11560 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  );.    if (ciphe
11570 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  r != NULL) {..ch
11580 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d  ar buf[BUFSIZ] =
11590 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c   {0};..int bits,
115a0 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20   alg_bits;.../* 
115b0 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  Cipher name */..
115c0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
115d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
115e0 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  her", SSL_CIPHER
115f0 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72  _get_name(cipher
11600 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43  ), -1);.../* RFC
11610 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
11620 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11630 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11640 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c  "standard_name",
11650 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e   SSL_CIPHER_stan
11660 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
11670 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65  ), -1);.../* Ope
11680 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70  nSSL name of cip
11690 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
116a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
116b0 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d  tr, "openssl_nam
116c0 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68  e", OPENSSL_ciph
116d0 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48  er_name(SSL_CIPH
116e0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
116f0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
11700 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73  ../* number of s
11710 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20  ecret bits used 
11720 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62  for cipher */..b
11730 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  its = SSL_CIPHER
11740 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72  _get_bits(cipher
11750 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c  , &alg_bits);..L
11760 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
11770 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72  p, objPtr, "secr
11780 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b  et_bits", bits);
11790 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
117a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
117b0 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20  lgorithm_bits", 
117c0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61  alg_bits);../* a
117d0 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61  lg_bits is actua
117e0 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74  l key secret bit
117f0 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61  s. If use bits a
11800 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72  nd secret (algor
11810 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65  ithm) bits diffe
11820 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20  r,..   the rest 
11830 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20  of the bits are 
11840 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20  fixed, i.e. for 
11850 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63  limited export c
11860 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35  iphers (bits < 5
11870 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63  6) */.../* Indic
11880 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54  ates which SSL/T
11890 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  LS protocol vers
118a0 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65  ion first define
118b0 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a  d the cipher */.
118c0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
118d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69  erp, objPtr, "mi
118e0 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f  n_version", SSL_
118f0 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69  CIPHER_get_versi
11900 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  on(cipher), -1);
11910 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44  .../* Cipher NID
11920 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
11930 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11940 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63   "cipherNID", (c
11950 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
11960 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
11970 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65  cipher_nid(ciphe
11980 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
11990 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
119a0 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49  bjPtr, "digestNI
119b0 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
119c0 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
119d0 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64  R_get_digest_nid
119e0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
119f0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11a00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65  erp, objPtr, "ke
11a10 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28  yExchangeNID", (
11a20 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
11a30 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
11a40 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29  _kx_nid(cipher))
11a50 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
11a60 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11a70 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74  tr, "authenticat
11a80 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  ionNID", (char *
11a90 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
11aa0 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f  CIPHER_get_auth_
11ab0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11ac0 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20  );.../* message 
11ad0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63  authentication c
11ae0 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20  ode - Cipher is 
11af0 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f  AEAD (e.g. GCM o
11b00 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31  r ChaCha20/Poly1
11b10 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09  305) or not */..
11b20 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64  /* Authenticated
11b30 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68   Encryption with
11b40 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
11b50 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f   (AEAD) check */
11b60 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
11b70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11b80 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c  cipher_is_aead",
11b90 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61   SSL_CIPHER_is_a
11ba0 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  ead(cipher));...
11bb0 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64  /* Digest used d
11bc0 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c  uring the SSL/TL
11bd0 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e  S handshake when
11be0 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65   using the ciphe
11bf0 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f  r. */..md = SSL_
11c00 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73  CIPHER_get_hands
11c10 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68  hake_digest(ciph
11c20 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  er);..LAPPEND_ST
11c30 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11c40 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  , "handshake_dig
11c50 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56  est", (char *)EV
11c60 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d  P_MD_name(md), -
11c70 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65  1);.../* Get Ope
11c80 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44  nSSL-specific ID
11c90 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f  , not IANA ID */
11ca0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11cb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11cc0 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29  ipher_id", (int)
11cd0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
11ce0 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  id(cipher));.../
11cf0 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73  * Two-byte ID us
11d00 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72  ed in the TLS pr
11d10 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69  otocol of the gi
11d20 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  ven cipher */..L
11d30 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
11d40 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
11d50 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20  ocol_id", (int) 
11d60 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70  SSL_CIPHER_get_p
11d70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65  rotocol_id(ciphe
11d80 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61  r));.../* Textua
11d90 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  l description of
11da0 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09   the cipher */..
11db0 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
11dc0 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65  escription(ciphe
11dd0 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  r, buf, sizeof(b
11de0 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  uf)) != NULL) {.
11df0 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
11e00 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11e10 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20   "description", 
11e20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20  buf, -1);..}.   
11e30 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69   }..    /* Sessi
11e40 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
11e50 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74  ession = SSL_get
11e60 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20  _session(ssl);. 
11e70 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21     if (session !
11e80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
11e90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11ea0 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ticket;..size_t 
11eb0 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20  len2;..unsigned 
11ec0 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74  int ulen;..const
11ed0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11ee0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f  session_id, *pro
11ef0 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  to;..unsigned ch
11f00 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41  ar buffer[SSL_MA
11f10 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
11f20 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  GTH];.../* Repor
11f30 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
11f40 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
11f50 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
11f60 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
11f70 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
11f80 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
11f90 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20  ession, &proto, 
11fa0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
11fb0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11fc0 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
11fd0 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
11fe0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
11ff0 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
12000 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
12010 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
12020 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74  the NPN negotiat
12030 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  ion */.#ifdef US
12040 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f  E_NPN..SSL_get0_
12050 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74  next_proto_negot
12060 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74  iated(ssl, &prot
12070 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  o, &ulen);..LAPP
12080 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12090 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28  objPtr, "npn", (
120a0 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28  char *) proto, (
120b0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
120c0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73  .#endif.../* Res
120d0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
120e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
120f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12100 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c  "resumable", SSL
12110 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75  _SESSION_is_resu
12120 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b  mable(session));
12130 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74  .../* Session st
12140 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64  art time (second
12150 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a  s since epoch) *
12160 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
12170 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12180 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53  "start_time", SS
12190 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
121a0 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  me(session));...
121b0 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65  /* Timeout value
121c0 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74   - SSL_CTX_get_t
121d0 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e  imeout (in secon
121e0 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
121f0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
12200 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20  Ptr, "timeout", 
12210 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12220 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29  timeout(session)
12230 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12240 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64  id - TLSv1.2 and
12250 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09   below only */..
12260 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
12270 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28  _SESSION_get_id(
12280 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
12290 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
122a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
122b0 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73   "session_id", s
122c0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
122d0 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
122e0 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78  * Session contex
122f0 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  t */..session_id
12300 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
12310 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73  et0_id_context(s
12320 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
12330 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
12340 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12350 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74  "session_context
12360 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ", session_id, (
12370 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
12380 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
12390 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e  cket - client on
123a0 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  ly */..SSL_SESSI
123b0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73  ON_get0_ticket(s
123c0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
123d0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
123e0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
123f0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
12400 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65  n_ticket", ticke
12410 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
12420 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n2);.../* Sessio
12430 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d  n ticket lifetim
12440 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e  e hint (in secon
12450 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
12460 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
12470 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c  Ptr, "lifetime",
12480 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12490 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
124a0 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b  _hint(session));
124b0 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70  .../* Ticket app
124c0 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45   data */.#if OPE
124d0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
124e0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
124f0 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  L..SSL_SESSION_g
12500 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61  et0_ticket_appda
12510 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20  ta((SSL_SESSION 
12520 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  *) session, &tic
12530 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  ket, &len2);..LA
12540 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
12550 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69  erp, objPtr, "ti
12560 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20  cket_app_data", 
12570 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
12580 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66  e) len2);.#endif
12590 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72  .../* Get master
125a0 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20   key */..len2 = 
125b0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
125c0 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69  master_key(sessi
125d0 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f  on, buffer, SSL_
125e0 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
125f0 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44  ENGTH);..LAPPEND
12600 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
12610 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f  objPtr, "master_
12620 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54  key", buffer, (T
12630 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
12640 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e  ../* Compression
12650 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64   id */..unsigned
12660 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45   int id = SSL_SE
12670 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65  SSION_get_compre
12680 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a  ss_id(session);.
12690 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
126a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
126b0 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69  mpression_id", i
126c0 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20  d == 1 ? "zlib" 
126d0 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20  : "none", -1);. 
126e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
126f0 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f  pression info */
12700 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
12710 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48  NULL) {.#ifdef H
12720 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53  AVE_SSL_COMPRESS
12730 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f  ION..const COMP_
12740 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65  METHOD *comp, *e
12750 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c  xpn;..comp = SSL
12760 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d  _get_current_com
12770 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09  pression(ssl);..
12780 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63  expn = SSL_get_c
12790 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e  urrent_expansion
127a0 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44  (ssl);...LAPPEND
127b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
127c0 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f  Ptr, "compressio
127d0 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43  n", comp ? SSL_C
127e0 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d  OMP_get_name(com
127f0 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  p) : "none", -1)
12800 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
12810 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12820 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e  expansion", expn
12830 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
12840 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f  name(expn) : "no
12850 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a  ne", -1);.#else.
12860 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12870 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
12880 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e  mpression", "non
12890 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  e", -1);..LAPPEN
128a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
128b0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e  jPtr, "expansion
128c0 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
128d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
128e0 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f    /* Server info
128f0 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20   */.    {..long 
12900 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67  mode = SSL_CTX_g
12910 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
12920 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
12930 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67  ctx);..char *msg
12940 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53  ;...if (mode & S
12950 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46  SL_SESS_CACHE_OF
12960 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  F) {..    msg = 
12970 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69  "off";..} else i
12980 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
12990 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29  SS_CACHE_CLIENT)
129a0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63   {..    msg = "c
129b0 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20  lient";..} else 
129c0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
129d0 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52  ESS_CACHE_SERVER
129e0 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  ) {..    msg = "
129f0 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65  server";..} else
12a00 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
12a10 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29  SESS_CACHE_BOTH)
12a20 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62   {..    msg = "b
12a30 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  oth";..} else {.
12a40 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e  .    msg = "unkn
12a50 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e  own";..}..LAPPEN
12a60 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12a70 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63  jPtr, "session_c
12a80 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c  ache_mode", msg,
12a90 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
12aa0 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20   /* CA List */. 
12ab0 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73     /* IF not a s
12ac0 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53  erver, same as S
12ad0 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f  SL_get0_peer_CA_
12ae0 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20  list. If server 
12af0 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f  same as SSL_CTX_
12b00 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69  get_client_CA_li
12b10 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74  st */.    listPt
12b20 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
12b30 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
12b40 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
12b50 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20  AME) *ca_list;. 
12b60 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20     if ((ca_list 
12b70 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74  = SSL_get_client
12b80 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21  _CA_list(ssl)) !
12b90 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
12ba0 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a  buffer[BUFSIZ];.
12bb0 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b  .for (int i = 0;
12bc0 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d   i < sk_X509_NAM
12bd0 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20  E_num(ca_list); 
12be0 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39  i++) {..    X509
12bf0 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b  _NAME *name = sk
12c00 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65  _X509_NAME_value
12c10 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20  (ca_list, i);.. 
12c20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09     if (name) {..
12c30 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69  .X509_NAME_oneli
12c40 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c  ne(name, buffer,
12c50 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f   BUFSIZ);...Tcl_
12c60 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12c70 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
12c80 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
12c90 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
12ca0 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  1));..    }..}. 
12cb0 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44     }.    LAPPEND
12cc0 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
12cd0 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c  Ptr, "caList", l
12ce0 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50  istPtr);.    LAP
12cf0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
12d00 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
12d10 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f  Count", sk_X509_
12d20 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
12d30 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  ));..    Tcl_Set
12d40 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12d50 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
12d60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
12d70 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
12d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
12dc0 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d   VersionObjCmd -
12dd0 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e  - return version
12de0 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65   string from Ope
12df0 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
12e00 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
12e10 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
12e20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
12e30 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
12e40 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e80 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
12e90 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  int.VersionObjCm
12ea0 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
12eb0 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
12ec0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12ed0 70 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  p,.    TCL_UNUSE
12ee0 44 28 69 6e 74 29 20 2f 2a 20 6f 62 6a 63 20 2a  D(int) /* objc *
12ef0 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  /,.    TCL_UNUSE
12f00 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  D(Tcl_Obj *const
12f10 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 2a 2f 29 0a   *) /* objv */).
12f20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
12f30 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69  bjPtr;..    dpri
12f40 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
12f50 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
12f60 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50  _NewStringObj(OP
12f70 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45  ENSSL_VERSION_TE
12f80 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63  XT, -1);..    Tc
12f90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12fa0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
12fb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
12fc0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13010 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64   *. * MiscObjCmd
13020 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64   -- misc command
13030 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
13040 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
13050 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
13060 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
13070 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
13080 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
130d0 4d 69 73 63 4f 62 6a 43 6d 64 28 0a 20 20 20 20  MiscObjCmd(.    
130e0 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20  TCL_UNUSED(void 
130f0 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  *),.    Tcl_Inte
13100 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20  rp *interp,.    
13110 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63  int objc,.    Tc
13120 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
13130 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 74 61 74 69  v[]).{.    stati
13140 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
13150 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72  mmands [] = { "r
13160 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e  eq", "strreq", N
13170 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
13180 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
13190 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d   C_STRREQ, C_DUM
131a0 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69  MY };.    Tcl_Si
131b0 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20  ze cmd;.    int 
131c0 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20  isStr;.    char 
131d0 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a  buffer[16384];..
131e0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
131f0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
13200 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
13210 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13220 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
13230 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
13240 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
13250 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13260 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
13270 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
13280 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
13290 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
132a0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f  0, &cmd) != TCL_
132b0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
132c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
132d0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
132e0 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74  ror();..    isSt
132f0 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
13300 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
13310 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
13320 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
13330 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
13340 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
13350 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
13360 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
13370 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
13380 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
13390 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
133a0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63  **listv;..    Tc
133b0 6c 5f 53 69 7a 65 20 6c 69 73 74 63 2c 69 3b 0a  l_Size listc,i;.
133c0 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e  ..    BIO *out=N
133d0 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 6f 6e 73 74  ULL;...    const
133e0 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b   char *k_C="",*k
133f0 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a  _ST="",*k_L="",*
13400 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c  k_O="",*k_OU="",
13410 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69  *k_CN="",*k_Emai
13420 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20  l="";..    char 
13430 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c  *keyout,*pemout,
13440 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b  *str;..    int k
13450 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c  eysize,serial=0,
13460 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f  days=365;..#if O
13470 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
13480 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
13490 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20  00L..    BIGNUM 
134a0 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  *bne = NULL;..  
134b0 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c    RSA *rsa = NUL
134c0 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56  L;.#else..    EV
134d0 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20  P_PKEY_CTX *ctx 
134e0 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
134f0 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35  .    if ((objc<5
13500 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b  ) || (objc>6)) {
13510 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ...Tcl_WrongNumA
13520 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13530 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65  bjv, "keysize ke
13540 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f  yfile certfile ?
13550 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72  info?");...retur
13560 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
13570 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63    }...    if (Tc
13580 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13590 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
135a0 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43   &keysize) != TC
135b0 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
135c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
135d0 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54   }..    keyout=T
135e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
135f0 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f  v[3]);..    pemo
13600 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
13610 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20  (objv[4]);..    
13620 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54  if (isStr) {...T
13630 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
13640 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,keyout,"",0);..
13650 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13660 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b  rp,pemout,"",0);
13670 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
13680 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69   (objc>=6) {...i
13690 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
136a0 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
136b0 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74  , objv[5], &list
136c0 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43  c, &listv) != TC
136d0 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65  L_OK) {...    re
136e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
136f0 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74  ..}....if ((list
13700 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20  c%2) != 0) {... 
13710 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
13720 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61  (interp,"Informa
13730 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68  tion list must h
13740 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20  ave even number 
13750 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55  of arguments",NU
13760 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
13770 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
13780 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c  ...for (i=0; i<l
13790 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09  istc; i+=2) {...
137a0 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53      str=Tcl_GetS
137b0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b  tring(listv[i]);
137c0 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d  ...    if (strcm
137d0 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30  p(str,"days")==0
137e0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
137f0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13800 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
13810 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09  days)!=TCL_OK)..
13820 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13830 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20  _ERROR;...    } 
13840 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13850 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30  str,"serial")==0
13860 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
13870 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13880 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
13890 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29  serial)!=TCL_OK)
138a0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
138b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
138c0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
138d0 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b  p(str,"C")==0) {
138e0 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53  ....k_C=Tcl_GetS
138f0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13900 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13910 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13920 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  ST")==0) {....k_
13930 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ST=Tcl_GetString
13940 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13950 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13960 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d  trcmp(str,"L")==
13970 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f  0) {....k_L=Tcl_
13980 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13990 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
139a0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
139b0 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"O")==0) {...
139c0 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_O=Tcl_GetStri
139d0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
139e0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
139f0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22  (strcmp(str,"OU"
13a00 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d  )==0) {....k_OU=
13a10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13a20 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13a30 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13a40 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29  mp(str,"CN")==0)
13a50 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47   {....k_CN=Tcl_G
13a60 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13a70 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13a80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13a90 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b  r,"Email")==0) {
13aa0 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f  ....k_Email=Tcl_
13ab0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13ac0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13ad0 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74  lse {....Tcl_Set
13ae0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55  Result(interp,"U
13af0 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72  nknown parameter
13b00 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75  ",NULL);....retu
13b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
13b20 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d      }...}..    }
13b30 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13b40 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13b50 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13b60 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a  bne = BN_new();.
13b70 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e  .    rsa = RSA_n
13b80 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20  ew();..    pkey 
13b90 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29  = EVP_PKEY_new()
13ba0 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d  ;..    if (bne =
13bb0 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d  = NULL || rsa ==
13bc0 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d   NULL || pkey ==
13bd0 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74   NULL || !BN_set
13be0 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34  _word(bne,RSA_F4
13bf0 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65  ) ||...!RSA_gene
13c00 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c  rate_key_ex(rsa,
13c10 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e   keysize, bne, N
13c20 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45  ULL) || !EVP_PKE
13c30 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65  Y_assign_RSA(pke
13c40 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50  y, rsa)) {...EVP
13c50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
13c60 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28  ;.../* RSA_free(
13c70 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45  rsa); freed by E
13c80 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a  VP_PKEY_free */.
13c90 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
13ca0 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20  #else..    pkey 
13cb0 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75  = EVP_RSA_gen((u
13cc0 6e 73 69 67 6e 65 64 20 69 6e 74 29 6b 65 79 73  nsigned int)keys
13cd0 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d  ize);..    ctx =
13ce0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65   EVP_PKEY_CTX_ne
13cf0 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20  w(pkey,NULL);.. 
13d00 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e     if (pkey == N
13d10 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55  ULL || ctx == NU
13d20 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f  LL || !EVP_PKEY_
13d30 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29  keygen_init(ctx)
13d40 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f   ||...!EVP_PKEY_
13d50 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67  CTX_set_rsa_keyg
13d60 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79  en_bits(ctx, key
13d70 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b  size) || !EVP_PK
13d80 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26  EY_keygen(ctx, &
13d90 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50  pkey)) {...EVP_P
13da0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
13db0 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66  ..EVP_PKEY_CTX_f
13dc0 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66  ree(ctx);.#endif
13dd0 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
13de0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
13df0 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74  enerating privat
13e00 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09  e key",NULL);...
13e10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e20 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
13e30 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
13e40 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
13e50 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
13e60 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
13e70 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75  io_PrivateKey(ou
13e80 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c  t,pkey,NULL,NULL
13e90 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09  ,0,NULL,NULL);..
13ea0 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28  .    i=BIO_read(
13eb0 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f  out,buffer,sizeo
13ec0 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09  f(buffer)-1);...
13ed0 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20      i=(i<0) ? 0 
13ee0 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65  : i;...    buffe
13ef0 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20  r[i]='\0';...   
13f00 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
13f10 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72  rp,keyout,buffer
13f20 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ,0);...    BIO_f
13f30 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20  lush(out);...   
13f40 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a   BIO_free(out);.
13f50 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
13f60 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
13f70 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20  _s_file());...  
13f80 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65    BIO_write_file
13f90 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
13fa0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
13fb0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
13fc0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
13fd0 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
13fe0 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77  ;...    /* PEM_w
13ff0 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76  rite_bio_RSAPriv
14000 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c  ateKey(out, rsa,
14010 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20   NULL, NULL, 0, 
14020 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a  NULL, NULL); */.
14030 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
14040 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09  ll(out);.. .}...
14050 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f  .if ((cert=X509_
14060 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a  new())==NULL) {.
14070 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
14080 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
14090 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72  r generating cer
140a0 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74  tificate request
140b0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45  ",NULL);...    E
140c0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
140d0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
140e0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
140f0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
14100 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
14110 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65  .#endif...    re
14120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14130 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f  ..}....X509_set_
14140 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b  version(cert,2);
14150 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f  ...ASN1_INTEGER_
14160 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72  set(X509_get_ser
14170 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c  ialNumber(cert),
14180 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f  serial);...X509_
14190 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f  gmtime_adj(X509_
141a0 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63  getm_notBefore(c
141b0 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f  ert),0);...X509_
141c0 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f  gmtime_adj(X509_
141d0 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65  getm_notAfter(ce
141e0 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a  rt),(long)60*60*
141f0 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39  24*days);...X509
14200 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74  _set_pubkey(cert
14210 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d  ,pkey);....name=
14220 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74  X509_get_subject
14230 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09  _name(cert);....
14240 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14250 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14260 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "C", MBSTRING_AS
14270 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14280 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20  ed char *) k_C, 
14290 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
142a0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
142b0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53  y_by_txt(name,"S
142c0 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  T", MBSTRING_ASC
142d0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
142e0 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20  d char *) k_ST, 
142f0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14300 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14310 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c  y_by_txt(name,"L
14320 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14330 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14340 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31   char *) k_L, -1
14350 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14360 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14370 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c  by_txt(name,"O",
14380 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14390 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
143a0 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20  har *) k_O, -1, 
143b0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
143c0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
143d0 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20  _txt(name,"OU", 
143e0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
143f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14400 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20  ar *) k_OU, -1, 
14410 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
14420 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
14430 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20  _txt(name,"CN", 
14440 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
14450 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14460 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20  ar *) k_CN, -1, 
14470 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
14480 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
14490 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c  _txt(name,"Email
144a0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
144b0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
144c0 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c   char *) k_Email
144d0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09  , -1, -1, 0);...
144e0 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63  .X509_set_subjec
144f0 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65  t_name(cert,name
14500 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f  );....if (!X509_
14510 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45  sign(cert,pkey,E
14520 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a  VP_sha256())) {.
14530 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28  ..    X509_free(
14540 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50  cert);...    EVP
14550 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
14560 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
14570 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
14580 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
14590 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
145a0 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f  endif...    Tcl_
145b0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
145c0 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20  ,"Error signing 
145d0 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c  certificate",NUL
145e0 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  L);...    return
145f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
14600 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a  ...if (isStr) {.
14610 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
14620 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a  w(BIO_s_mem());.
14630 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
14640 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72  bio_X509(out,cer
14650 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  t);...    i=BIO_
14660 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
14670 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
14680 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
14690 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
146a0 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
146b0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
146c0 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62  (interp,pemout,b
146d0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
146e0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
146f0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
14700 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
14710 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
14720 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
14730 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
14740 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65  _filename(out,pe
14750 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  mout);...    PEM
14760 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28  _write_bio_X509(
14770 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20  out,cert);...   
14780 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75   BIO_free_all(ou
14790 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f  t);...}....X509_
147a0 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56  free(cert);...EV
147b0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
147c0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
147d0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
147e0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e  0x30000000L...BN
147f0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64  _free(bne);.#end
14800 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72  if..    }..}..br
14810 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
14820 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  :..break;.    }.
14830 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
14840 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  K;.}.../********
14850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
14860 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20   Init           
14870 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
14880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
14890 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
148a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148d0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
148e0 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Free --. *. *.Th
148f0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
14900 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
14910 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
14920 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
14930 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
14940 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
14950 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20  s below 1. *. * 
14960 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
14970 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
14980 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
14990 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
149a0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
149b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149e0 2d 2d 2d 2d 0a 20 2a 2f 0a 23 75 6e 64 65 66 20  ----. */.#undef 
149f0 54 6c 73 5f 46 72 65 65 0a 76 6f 69 64 0a 23 69  Tls_Free.void.#i
14a00 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
14a10 49 4f 4e 20 3e 20 38 0a 54 6c 73 5f 46 72 65 65  ION > 8.Tls_Free
14a20 28 76 6f 69 64 20 2a 62 6c 6f 63 6b 50 74 72 29  (void *blockPtr)
14a30 0a 23 65 6c 73 65 0a 54 6c 73 5f 46 72 65 65 28  .#else.Tls_Free(
14a40 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 0a  char *blockPtr).
14a50 23 65 6e 64 69 66 0a 7b 0a 20 20 20 20 53 74 61  #endif.{.    Sta
14a60 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
14a70 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72  State *)blockPtr
14a80 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
14a90 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54  Called");..    T
14aa0 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74  ls_Clean(statePt
14ab0 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62  r);.    ckfree(b
14ac0 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  lockPtr);.}.../*
14ad0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b10 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
14b20 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09  _Clean --. *. *.
14b30 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
14b40 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
14b50 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
14b60 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
14b70 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
14b80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
14b90 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68  lls below 1.  Th
14ba0 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20  is should. *.be 
14bb0 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f  called synchrono
14bc0 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73  usly by the Clos
14bd0 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68  eProc, not in th
14be0 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46  e. *.EventuallyF
14bf0 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  ree callback.. *
14c00 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
14c10 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
14c20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
14c30 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
14c40 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
14c90 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74  d Tls_Clean(Stat
14ca0 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20  e *statePtr) {. 
14cb0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14cc0 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ed");..    /*.  
14cd0 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d     * we're assum
14ce0 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65  ing here that we
14cf0 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61  're single-threa
14d00 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ded.     */.    
14d10 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
14d20 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
14d30 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
14d40 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
14d50 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
14d60 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
14d70 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c  Ptr->timer = NUL
14d80 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
14d90 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
14da0 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74  os) {..ckfree(st
14db0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b  atePtr->protos);
14dc0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
14dd0 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  os = NULL;.    }
14de0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14df0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68  r->bio) {../* Th
14e00 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c  is will call SSL
14e10 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31  _shutdown. Bug 1
14e20 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e  414045 */..dprin
14e30 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  tf("BIO_free_all
14e40 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
14e50 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  >bio);..BIO_free
14e60 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _all(statePtr->b
14e70 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  io);..statePtr->
14e80 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bio = NULL;.    
14e90 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
14ea0 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69  tr->ssl) {..dpri
14eb0 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70  ntf("SSL_free(%p
14ec0 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  )", statePtr->ss
14ed0 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74  l);..SSL_free(st
14ee0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73  atePtr->ssl);..s
14ef0 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e  tatePtr->ssl = N
14f00 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14f10 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  f (statePtr->ctx
14f20 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  ) {..SSL_CTX_fre
14f30 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
14f40 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ;..statePtr->ctx
14f50 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14f60 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14f70 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63  >callback) {..Tc
14f80 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
14f90 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
14fa0 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  k);..statePtr->c
14fb0 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  allback = NULL;.
14fc0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
14fd0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
14fe0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
14ff0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
15000 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74  password);..stat
15010 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
15020 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
15030 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
15040 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  cmd) {..Tcl_Decr
15050 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
15060 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65  r->vcmd);..state
15070 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c  Ptr->vcmd = NULL
15080 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
15090 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
150a0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150f0 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49  --. *. * Build I
15100 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20  nfo Command --. 
15110 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d  *. *.Create comm
15120 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75  and to return bu
15130 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63  ild info for pac
15140 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  kage.. *. * Resu
15150 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
15160 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a  rd Tcl result. *
15170 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
15180 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69  :. *.Created bui
15190 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e  ld-info command.
151a0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
151f0 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47  ..#ifndef STRING
15200 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54  IFY.#  define ST
15210 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e  RINGIFY(x) STRIN
15220 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69  GIFY1(x).#  defi
15230 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29  ne STRINGIFY1(x)
15240 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a   #x.#endif..int.
15250 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64  BuildInfoCommand
15260 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74  (Tcl_Interp* int
15270 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  erp) {.    Tcl_C
15280 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  mdInfo info;..  
15290 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d    if (Tcl_GetCom
152a0 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
152b0 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69   "::tcl::build-i
152c0 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a  nfo", &info)) {.
152d0 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
152e0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
152f0 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f  :tls::build-info
15300 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c  ", info.objProc,
15310 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43   (void *)(...PAC
15320 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22  KAGE_VERSION "+"
15330 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56   STRINGIFY(TLS_V
15340 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66  ERSION_UUID).#if
15350 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67   defined(__clang
15360 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  __) && defined(_
15370 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a  _clang_major__).
15380 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22  ...    ".clang-"
15390 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61   STRINGIFY(__cla
153a0 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20  ng_major__).#if 
153b0 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20  __clang_minor__ 
153c0 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a  < 10....    "0".
153d0 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54  #endif....    ST
153e0 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f  RINGIFY(__clang_
153f0 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a  minor__).#endif.
15400 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70  #if defined(__cp
15410 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66  lusplus) && !def
15420 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09  ined(__OBJC__)..
15430 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75  ..    ".cplusplu
15440 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  s".#endif.#ifnde
15450 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20  f NDEBUG....    
15460 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a  ".debug".#endif.
15470 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63  #if !defined(__c
15480 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69  lang__) && !defi
15490 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50  ned(__INTEL_COMP
154a0 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64  ILER) && defined
154b0 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20  (__GNUC__)....  
154c0 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47    ".gcc-" STRING
154d0 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69  IFY(__GNUC__).#i
154e0 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f  f __GNUC_MINOR__
154f0 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22   < 10....    "0"
15500 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53  .#endif....    S
15510 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f  TRINGIFY(__GNUC_
15520 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a  MINOR__).#endif.
15530 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43  #ifdef __INTEL_C
15540 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22  OMPILER....    "
15550 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59  .icc-" STRINGIFY
15560 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45  (__INTEL_COMPILE
15570 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  R).#endif.#ifdef
15580 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09   TCL_MEM_DEBUG..
15590 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67  ..    ".memdebug
155a0 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ".#endif.#if def
155b0 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09  ined(_MSC_VER)..
155c0 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53  ..    ".msvc-" S
155d0 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45  TRINGIFY(_MSC_VE
155e0 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  R).#endif.#ifdef
155f0 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20   USE_NMAKE....  
15600 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69    ".nmake".#endi
15610 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46  f.#ifndef TCL_CF
15620 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20  G_OPTIMIZED.... 
15630 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65     ".no-optimize
15640 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
15650 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20  __OBJC__....    
15660 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23  ".objective-c".#
15670 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c  if defined(__cpl
15680 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22  usplus)....    "
15690 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66  plusplus".#endif
156a0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54  .#endif.#ifdef T
156b0 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a  CL_CFG_PROFILED.
156c0 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65  ...    ".profile
156d0 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
156e0 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e  PURIFY....    ".
156f0 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23  purify".#endif.#
15700 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49  ifdef STATIC_BUI
15710 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74  LD....    ".stat
15720 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20  ic".#endif...), 
15730 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NULL);.    }.   
15740 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15750 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
157a0 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20   * Tls_Init --. 
157b0 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70  *. *.This is a p
157c0 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a  ackage initializ
157d0 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c  ation procedure,
157e0 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64   which is called
157f0 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20  . *.by Tcl when 
15800 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20  this package is 
15810 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  to be added to a
15820 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  n interpreter.. 
15830 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53  *. * Results:  S
15840 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e  sl configured an
15850 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53  d loaded. *. * S
15860 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
15870 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20   create the ssl 
15880 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c  command, initial
15890 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a  ize ssl context.
158a0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69  --------. */..#i
158f0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
15900 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20  ION > 8.#define 
15910 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30  MIN_VERSION "9.0
15920 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ".#else.#define 
15930 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35  MIN_VERSION "8.5
15940 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ".#endif..static
15950 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
15960 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
15970 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
15980 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
15990 20 20 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20    };..DLLEXPORT 
159a0 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c  int Tls_Init(Tcl
159b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
159c0 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
159d0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64  "Called");..#ifd
159e0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
159f0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69  .    if (Tcl_Ini
15a00 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d  tStubs(interp, M
15a10 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
15a20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
15a30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15a40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
15a50 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65   (Tcl_PkgRequire
15a60 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20  (interp, "Tcl", 
15a70 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20  MIN_VERSION, 0) 
15a80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
15a90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15aa0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73    }..    if (Tls
15ab0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
15ac0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
15ad0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15ae0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69  , "could not ini
15af0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72  tialize SSL libr
15b00 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ary", (char *)NU
15b10 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
15b20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
15b30 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15b40 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15b50 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  "::tls::ciphers"
15b60 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c  , CiphersObjCmd,
15b70 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20   (void *) NULL, 
15b80 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15b90 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15ba0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15bb0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
15bc0 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  :tls::connection
15bd0 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
15be0 6f 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a  oObjCmd, (void *
15bf0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
15c00 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15c10 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15c20 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15c30 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61  terp, "::tls::ha
15c40 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
15c50 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64  akeObjCmd, (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 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f  import", ImportO
15cc0 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20  bjCmd, (void *) 
15cd0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
15ce0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15cf0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15d00 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15d10 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d  rp, "::tls::unim
15d20 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f  port", UnimportO
15d30 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a 29 20  bjCmd, (void *) 
15d40 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
15d50 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15d60 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15d70 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15d80 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74  rp, "::tls::stat
15d90 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
15da0 64 2c 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c  d, (void *) NULL
15db0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15dc0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15dd0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15de0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15df0 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22  "::tls::version"
15e00 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c  , VersionObjCmd,
15e10 20 28 76 6f 69 64 20 2a 29 20 4e 55 4c 4c 2c 20   (void *) NULL, 
15e20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15e30 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15e40 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15e50 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
15e60 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73  :tls::misc", Mis
15e70 63 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64 20 2a  cObjCmd, (void *
15e80 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
15e90 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15ea0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15eb0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15ec0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72  terp, "::tls::pr
15ed0 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63  otocols", Protoc
15ee0 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 76 6f 69 64  olsObjCmd, (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 0a 20 20 20 20 42 75 69 6c  NULL);..    Buil
15f20 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74  dInfoCommand(int
15f30 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69  erp);..    if (i
15f40 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61  nterp && Tcl_Eva
15f50 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c  l(interp, tlsTcl
15f60 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54  InitScript) != T
15f70 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
15f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15f90 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  }..    return Tc
15fa0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
15fb0 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d  erp, PACKAGE_NAM
15fc0 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  E, PACKAGE_VERSI
15fd0 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ON);.}../*. *---
15fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16010 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53  ---*. *. *.Tls_S
16020 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  afeInit --. *. *
16030 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
16040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16060 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70  -*. *.Standard p
16070 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65  rocedure require
16080 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09  d by 'load'.. *.
16090 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73  Initializes this
160a0 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61   extension for a
160b0 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65   safe interprete
160c0 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.. *.----------
160d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160f0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
16100 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
16110 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27  As of 'Tls_Init'
16120 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
16130 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63  *..A standard Tc
16140 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  l error code.. *
16150 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a  ---------*. */..
16190 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
161a0 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  s_SafeInit(Tcl_I
161b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
161c0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
161d0 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  lled");.    retu
161e0 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65  rn Tls_Init(inte
161f0 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  rp);.}../*. *---
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16230 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69  ---*. *. *.TlsLi
16240 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  bInit --. *. *.-
16250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16280 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
16290 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65  SSL library once
162a0 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   per application
162b0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
162c0 2d 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 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
162f0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e   effects:. *..in
16300 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
16310 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75  brary. *. *.Resu
16320 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a  lt:. *..none. *.
16330 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
16370 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
16380 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
16390 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74  lize) {.    stat
163a0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
163b0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
163c0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
163d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
163e0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
163f0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
16400 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74  EADS).    size_t
16410 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64   num_locks;.#end
16420 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e  if..    if (unin
16430 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20  itialize) {..if 
16440 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
16450 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41  ..    dprintf("A
16460 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
16470 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65  lize, but we are
16480 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
16490 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e  ");...    return
164a0 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70   TCL_OK;..}...dp
164b0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
164c0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a  uninitialize");.
164d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
164e0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
164f0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
16500 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
16510 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  Lock(&init_mx);.
16520 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09  ..if (locks) {..
16530 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
16540 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55  ..    locks = NU
16550 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f  LL;..    locksCo
16560 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64  unt = 0;..}.#end
16570 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20  if..initialized 
16580 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
16590 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
165a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
165b0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
165c0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
165d0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  t_mx);.#endif...
165e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
165f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e     }..    if (in
16600 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70  itialized) {..dp
16610 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62  rintf("Called, b
16620 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20  ut using cached 
16630 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e  value");..return
16640 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a   status;.    }..
16650 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
16660 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
16670 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16680 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16690 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
166a0 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26   Tcl_MutexLock(&
166b0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
166c0 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
166d0 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 1;..#if defin
166e0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
166f0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
16700 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
16710 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20  num_locks = 1;. 
16720 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
16730 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
16740 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
16750 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
16760 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
16770 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
16780 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
16790 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
167a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
167b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
167c0 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
167d0 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
167e0 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
167f0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
16800 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
16810 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
16820 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
16830 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
16840 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
16850 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
16860 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
16870 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f   NULL);..    BIO
16880 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
16890 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a  );..#if 0.    /*
168a0 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f  .     * XXX:TODO
168b0 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f  : Remove this co
168c0 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  de and replace i
168d0 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20  t with a check. 
168e0 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68      * for enough
168f0 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20   entropy and do 
16900 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74  not try to creat
16910 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a  e our own.     *
16920 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70   terrible entrop
16930 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a  y.     */.    /*
16940 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65  .     * Seed the
16950 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
16960 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  enerator in the 
16970 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20  SSL library,.   
16980 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f    * using the do
16990 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74  /while construct
169a0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
169b0 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a  bug note in the.
169c0 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46       * OpenSSL F
169d0 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77  AQ at http://www
169e0 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70  .openssl.org/sup
169f0 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53  port/faq.html#US
16a00 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ER1.     *.     
16a10 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68  * The crux of th
16a20 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61  e problem is tha
16a30 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73  t Solaris 7 does
16a40 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20   not have a.    
16a50 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f   * /dev/random o
16a60 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64  r /dev/urandom d
16a70 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e  evice so it cann
16a80 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68  ot gather enough
16a90 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20  .     * entropy 
16aa0 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65  from the RAND_se
16ab0 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e  ed() when TLS in
16ac0 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65  itializes and re
16ad0 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20  fuses.     * to 
16ae0 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c  go further. Earl
16af0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
16b00 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20  OpenSSL carried 
16b10 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  on regardless.. 
16b20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64      */.    srand
16b30 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
16b40 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20  time((time_t *) 
16b50 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b  NULL));.    do {
16b60 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
16b70 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  < 16; i++) {..  
16b80 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20    rnd_seed[i] = 
16b90 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e  1 + (char) (255.
16ba0 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44  0 * rand()/(RAND
16bb0 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09  _MAX+1.0));..}..
16bc0 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65  RAND_seed(rnd_se
16bd0 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73  ed, sizeof(rnd_s
16be0 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69  eed));.    } whi
16bf0 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28  le (RAND_status(
16c00 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ) != 1);.#endif.
16c10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
16c20 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
16c30 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
16c40 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75  EADS).    Tcl_Mu
16c50 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
16c60 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  mx);.#endif..   
16c70 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a   return status;.
16c80 7d 0a                                            }.