Hex Artifact Content

Artifact 4d8cd2091316d1ff08eb98caff0bb0ba7c9cebcbb52e8981e638853f0838d346:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75  crypto.h>.#inclu
03a0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e  de <openssl/ssl.
03b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03c0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e 63  nssl/evp.h>.#inc
03d0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 62  lude <openssl/ob
03e0: 6a 65 63 74 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  jects.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c 20 66  /*. * External f
04b0: 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a  unctions. */../*
04c0: 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  . * Forward decl
04d0: 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64  arations. */..#d
04e0: 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64  efine F2N(key, d
04f0: 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d  sp) \..(((key) =
0500: 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20  = NULL) ? (char 
0510: 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63  *) NULL : \...Tc
0520: 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
0530: 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79  ame(interp, (key
0540: 29 2c 20 28 64 73 70 29 29 29 0a 0a 73 74 61 74  ), (dsp)))..stat
0550: 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f  ic SSL_CTX *CTX_
0560: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74  Init(State *stat
0570: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76  ePtr, int isServ
0580: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63  er, int proto, c
0590: 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72  har *key,...char
05a0: 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69   *certfile, unsi
05b0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61  gned char *key_a
05c0: 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  sn1, unsigned ch
05d0: 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09  ar *cert_asn1,..
05e0: 09 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65  .int key_asn1_le
05f0: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31  n, int cert_asn1
0600: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69  _len, char *CAdi
0610: 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c  r, char *CAfile,
0620: 0a 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73  ...char *ciphers
0630: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
0640: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
0650: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
0660: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c  ;..static int.Tl
0670: 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69  sLibInit(int uni
0680: 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65  nitialize);..#de
0690: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
06a0: 53 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e  SL2..0x01.#defin
06b0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
06c0: 09 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54  ..0x02.#define T
06d0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30  LS_PROTO_TLS1..0
06e0: 78 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x04.#define TLS_
06f0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30  PROTO_TLS1_1.0x0
0700: 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  8.#define TLS_PR
0710: 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a  OTO_TLS1_2.0x10.
0720: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0730: 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64  O_TLS1_3.0x20.#d
0740: 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c  efine ENABLED(fl
0750: 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61  ag, mask).(((fla
0760: 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20  g) & (mask)) == 
0770: 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65  (mask))..#define
0780: 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09   SSLKEYLOGFILE..
0790: 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a  "SSLKEYLOGFILE".
07a0: 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 61  ./*. * Thread-Sa
07b0: 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a  fe TLS Code. */.
07c0: 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45  .#ifdef TCL_THRE
07d0: 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e  ADS.#define OPEN
07e0: 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e  SSL_THREAD_DEFIN
07f0: 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  ES.#include <ope
0800: 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66  nssl/opensslconf
0810: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e  .h>..#ifdef OPEN
0820: 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63  SSL_THREADS.#inc
0830: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72  lude <openssl/cr
0840: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypto.h>.#include
0850: 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e   <openssl/ssl.h>
0860: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64  ../*. * Threaded
0870: 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69   operation requi
0880: 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c  res locking call
0890: 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66  backs. * Based f
08a0: 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70  rom /crypto/cryp
08b0: 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53  tlib.c of OpenSS
08c0: 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e  L and NSOpenSSL.
08d0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c  . */..static Tcl
08e0: 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20  _Mutex *locks = 
08f0: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74  NULL;.static int
0900: 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b   locksCount = 0;
0910: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65  .static Tcl_Mute
0920: 78 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69  x init_mx;.#endi
0930: 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52  f /* OPENSSL_THR
0940: 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  EADS */.#endif /
0950: 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f  * TCL_THREADS */
0960: 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
0970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61  *********/./* Ca
0980: 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a  llbacks        *
0990: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
09a0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61  --. *. * Eval Ca
0a00: 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d  llback Command -
0a10: 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c  -. *. *.Eval cal
0a20: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e  lback command an
0a30: 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f  d catch any erro
0a40: 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  rs. *. * Results
0a50: 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64  :. *.0 = Command
0a60: 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f   returned fail o
0a70: 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20  r eval returned 
0a80: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d  TCL_ERROR. *.1 =
0a90: 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65   Command returne
0aa0: 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 76 61  d success or eva
0ab0: 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f  l returned TCL_O
0ac0: 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  K. *. * Side eff
0ad0: 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74  ects:. *.Evaluat
0ae0: 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  es callback comm
0af0: 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  and. *. *-------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0b40: 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c  .static int.Eval
0b50: 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74  Callback(Tcl_Int
0b60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61  erp *interp, Sta
0b70: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63  te *statePtr, Tc
0b80: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b  l_Obj *cmdPtr) {
0b90: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f  .    int code, o
0ba0: 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 54 63 6c 5f  k = 0;..    Tcl_
0bb0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
0bc0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
0bd0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
0be0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
0bf0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
0c00: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69  Eval callback wi
0c10: 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f  th success for o
0c20: 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75  k or return valu
0c30: 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72  e 1, fail for er
0c40: 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61  ror or return va
0c50: 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c  lue 0 */.    Tcl
0c60: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
0c70: 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  erp);.    code =
0c80: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
0c90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
0ca0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
0cb0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
0cc0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43   TCL_OK) {../* C
0cd0: 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20  heck result for 
0ce0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
0cf0: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74  .Tcl_Obj *result
0d00: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
0d10: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66  ult(interp);..if
0d20: 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c   (result == NULL
0d30: 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72   || Tcl_GetIntFr
0d40: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65  omObj(interp, re
0d50: 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43  sult, &ok) != TC
0d60: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20  L_OK) {..    ok 
0d70: 3d 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  = 1;..}.    } el
0d80: 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d  se {../* Error -
0d90: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74   reject the cert
0da0: 69 66 69 63 61 74 65 20 2a 2f 0a 23 69 66 20 28  ificate */.#if (
0db0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
0dc0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
0dd0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
0de0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
0df0: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
0e00: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
0e10: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
0e20: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
0e30: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
0e40: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
0e50: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
0e60: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
0e70: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
0e80: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
0e90: 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a  eturn ok;.}.../*
0ea0: 0a 20 2a 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 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66  ------. *. * Inf
0ef0: 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  oCallback --. *.
0f00: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
0f10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65  connection proce
0f20: 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ss. *. * Results
0f30: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
0f40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
0f50: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
0f60: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
0f70: 20 2a 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 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
0fc0: 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61   void.InfoCallba
0fd0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
0fe0: 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e  l, int where, in
0ff0: 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61  t ret) {.    Sta
1000: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1010: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
1020: 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73  pp_data((SSL *)s
1030: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  sl);.    Tcl_Int
1040: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
1050: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
1060: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
1070: 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d  Ptr;.    char *m
1080: 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f  ajor; char *mino
1090: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
10a0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
10b0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
10c0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
10d0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
10e0: 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72  n;..    if (wher
10f0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
1100: 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d  HAKE_START) {..m
1110: 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b  ajor = "handshak
1120: 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74  e";..minor = "st
1130: 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  art";.    } else
1140: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
1150: 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f  _CB_HANDSHAKE_DO
1160: 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22  NE) {..major = "
1170: 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e  handshake";..min
1180: 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20  or = "done";.   
1190: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77   } else {..if (w
11a0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c  here & SSL_CB_AL
11b0: 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61  ERT)..major = "a
11c0: 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20  lert";..else if 
11d0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f  (where & SSL_ST_
11e0: 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d  CONNECT).major =
11f0: 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73   "connect";..els
1200: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1210: 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61  L_ST_ACCEPT)..ma
1220: 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a  jor = "accept";.
1230: 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20  .else.....major 
1240: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69  = "unknown";...i
1250: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1260: 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d  B_READ)..minor =
1270: 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69   "read";..else i
1280: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1290: 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20  B_WRITE)..minor 
12a0: 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65  = "write";..else
12b0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
12c0: 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72  _CB_LOOP)..minor
12d0: 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65   = "loop";..else
12e0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
12f0: 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72  _CB_EXIT)..minor
1300: 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65   = "exit";..else
1310: 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e  .....minor = "un
1320: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1330: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
1340: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
1350: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
1360: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
1370: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
1380: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1390: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
13a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
13b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13c0: 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20  ("info", -1));. 
13d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
13e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
13f0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1400: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1410: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
1420: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
1430: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
1440: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1450: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1460: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1470: 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c  StringObj(major,
1480: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
14b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
14c0: 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29  gObj(minor, -1))
14d0: 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65  ;..    if (where
14e0: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
14f0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
1500: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1510: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1520: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1530: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73  bj(SSL_alert_des
1540: 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65  c_string_long(re
1550: 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  t), -1));..Tcl_L
1560: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1570: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1580: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1590: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c  StringObj(SSL_al
15a0: 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f  ert_type_string_
15b0: 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b  long(ret), -1));
15c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
15d0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
15e0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
15f0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
1600: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
1610: 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c  L_state_string_l
1620: 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a  ong(ssl), -1));.
1630: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
1640: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1650: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1660: 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f  wStringObj("info
1670: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a  ", -1));.    }..
1680: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
1690: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
16a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
16b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
16c0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
16d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
16e0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
16f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
1700: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
1710: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61  ----. *. * Messa
1760: 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  geCallback --. *
1770: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.Monitors SSL
1780: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67   protocol messag
1790: 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  es. *. * Results
17a0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
17b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
17c0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
17d0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
17e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65  -----. */.#ifnde
1830: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  f OPENSSL_NO_SSL
1840: 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f  _TRACE.static vo
1850: 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61  id.MessageCallba
1860: 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20  ck(int write_p, 
1870: 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74  int version, int
1880: 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63   content_type, c
1890: 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20  onst void *buf, 
18a0: 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20  size_t len, SSL 
18b0: 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29  *ssl, void *arg)
18c0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
18d0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
18e0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
18f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
1900: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
1910: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
1920: 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  dPtr;.    char *
1930: 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20  ver, *type;.    
1940: 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68  BIO *bio;.    ch
1950: 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d  ar buffer[15000]
1960: 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20  ;.    buffer[0] 
1970: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
1980: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
1990: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
19a0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
19b0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74  _Obj*)NULL)..ret
19c0: 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68  urn;..    switch
19d0: 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20  (version) {.#if 
19e0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
19f0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
1a00: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
1a10: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
1a20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
1a30: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20  _SSL2).    case 
1a40: 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  SSL2_VERSION:..v
1a50: 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62  er = "SSLv2";..b
1a60: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
1a70: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
1a80: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
1a90: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a  PENSSL_NO_SSL3).
1aa0: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45      case SSL3_VE
1ab0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53  RSION:..ver = "S
1ac0: 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  SLv3";..break;.#
1ad0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1ae0: 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  LS1_VERSION:..ve
1af0: 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72  r = "TLSv1";..br
1b00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c  eak;.    case TL
1b10: 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  S1_1_VERSION:..v
1b20: 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a  er = "TLSv1.1";.
1b30: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1b40: 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a   TLS1_2_VERSION:
1b50: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32  ..ver = "TLSv1.2
1b60: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1b70: 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  ase TLS1_3_VERSI
1b80: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b90: 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.3";..break;.  
1ba0: 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d    case 0:..ver =
1bb0: 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b   "none";..break;
1bc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76  .    default:..v
1bd0: 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  er = "unknown";.
1be0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20  .break;.    }.. 
1bf0: 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65     switch (conte
1c00: 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63  nt_type) {.    c
1c10: 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44  ase SSL3_RT_HEAD
1c20: 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61  ER:..type = "Hea
1c30: 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  der";..break;.  
1c40: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49    case SSL3_RT_I
1c50: 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50  NNER_CONTENT_TYP
1c60: 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65  E:..type = "Inne
1c70: 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b  r Content Type";
1c80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1c90: 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45  e SSL3_RT_CHANGE
1ca0: 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74  _CIPHER_SPEC:..t
1cb0: 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69  ype = "Change Ci
1cc0: 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  pher";..break;. 
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1ce0: 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22  ALERT:..type = "
1cf0: 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a  Alert";..break;.
1d00: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1d10: 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70  _HANDSHAKE:..typ
1d20: 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b  e = "Handshake";
1d30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1d40: 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43  e SSL3_RT_APPLIC
1d50: 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70  ATION_DATA:..typ
1d60: 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a  e = "App Data";.
1d70: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d80: 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54 42   DTLS1_RT_HEARTB
1d90: 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48 65  EAT:..type = "He
1da0: 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61 6b  artbeat";..break
1db0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
1dc0: 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  type = "unknown"
1dd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1de0: 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69  Needs compile ti
1df0: 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c  me option "enabl
1e00: 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f  e-ssl-trace". */
1e10: 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20  .    if ((bio = 
1e20: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
1e30: 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  m())) != NULL) {
1e40: 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72  ..int n;..SSL_tr
1e50: 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72  ace(write_p, ver
1e60: 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79  sion, content_ty
1e70: 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73  pe, buf, len, ss
1e80: 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b  l, (void *)bio);
1e90: 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62  ..n = BIO_read(b
1ea0: 69 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e 28  io, buffer, min(
1eb0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1ec0: 2c 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d 20  , 14999));..n = 
1ed0: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09  (n<0) ? 0 : n;..
1ee0: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09  buffer[n] = 0;..
1ef0: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28  (void)BIO_flush(
1f00: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  bio);..BIO_free(
1f10: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20  bio);.   }..    
1f20: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
1f30: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
1f40: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
1f50: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
1f60: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
1f70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1f80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1f90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
1fa0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
1fb0: 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20  essage", -1));. 
1fc0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1fd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1fe0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1ff0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2000: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2010: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2020: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2030: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2040: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2050: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2060: 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f  StringObj(write_
2070: 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65  p ? "Sent" : "Re
2080: 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20  ceived", -1));. 
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72  NewStringObj(ver
20d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
20e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
20f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2100: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
2110: 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29  ngObj(type, -1))
2120: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2130: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2140: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2150: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2160: 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20  buffer, -1));.. 
2170: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
2180: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
2190: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
21a0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
21b0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
21c0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
21d0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
21e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
21f0: 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  dPtr);.}.#endif.
2200: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2250: 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20   VerifyCallback 
2260: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
2270: 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74  s SSL certificat
2280: 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f  e validation pro
2290: 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f  cess. Used to co
22a0: 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68  ntrol the. *.beh
22b0: 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53  avior when the S
22c0: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66  SL_VERIFY_PEER f
22d0: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
22e0: 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68   is called. *.wh
22f0: 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69  enever a certifi
2300: 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65  cate is inspecte
2310: 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76  d or decided inv
2320: 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72  alid. Called for
2330: 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69  . *.each certifi
2340: 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74  cate in the cert
2350: 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68   chain.. *. * Ch
2360: 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66 69  ecks:. *.certifi
2370: 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 63 68  cate chain is ch
2380: 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77  ecked starting w
2390: 69 74 68 20 74 68 65 20 64 65 65 70 65 73 74 20  ith the deepest 
23a0: 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a  nesting level. *
23b0: 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20  .  (the root CA 
23c0: 63 65 72 74 69 66 69 63 61 74 65 29 20 61 6e 64  certificate) and
23d0: 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74   worked upward t
23e0: 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 65 72  o the peer's cer
23f0: 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c  tificate.. *.All
2400: 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 65 20   signatures are 
2410: 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74  valid, current t
2420: 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66 69  ime is within fi
2430: 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c  rst and last val
2440: 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43  idity time.. *.C
2450: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 65  heck that the ce
2460: 72 74 69 66 69 63 61 74 65 20 69 73 20 69 73 73  rtificate is iss
2470: 75 65 64 20 62 79 20 74 68 65 20 69 73 73 75 65  ued by the issue
2480: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  r certificate is
2490: 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74  suer.. *.Check t
24a0: 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74  he revocation st
24b0: 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 63 65  atus for each ce
24c0: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68  rtificate.. *.Ch
24d0: 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79  eck the validity
24e0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43 52   of the given CR
24f0: 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 20 72  L and the cert r
2500: 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73  evocation status
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70  .. *.Check the p
2520: 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74  olicies of all t
2530: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 73 0a  he certificates.
2540: 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72   *. * Args. *.pr
2550: 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63  everify_ok indic
2560: 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65  ates whether the
2570: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72   certificate ver
2580: 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64  ification passed
2590: 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a   (1) or not (0).
25a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
25b0: 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75  *.A callback bou
25c0: 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74  nd to the socket
25d0: 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20   may return one 
25e0: 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d  of:. *.    0...-
25f0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
2600: 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c   is deemed inval
2610: 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63  id, send verific
2620: 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61  ation. *....  fa
2630: 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70  ilure alert to p
2640: 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61  eer, and termina
2650: 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  te handshake.. *
2660: 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63  .    1...- the c
2670: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65  ertificate is de
2680: 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74  emed valid, cont
2690: 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73 68  inue with handsh
26a0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74  ake.. *.    empt
26b0: 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68  y string.- no ch
26c0: 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69 63  ange to certific
26d0: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20  ate validation. 
26e0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
26f0: 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69  s:. *.The err fi
2700: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
2710: 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53  ntly operative S
2720: 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20  tate is set. *. 
2730: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73   to a string des
2740: 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20  cribing the SSL 
2750: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c  negotiation fail
2760: 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a  ure reason. *. *
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27b0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
27c0: 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63  nt.VerifyCallbac
27d0: 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53  k(int ok, X509_S
27e0: 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b  TORE_CTX *ctx) {
27f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
2800: 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20  dPtr;.    SSL   
2810: 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35  *ssl..= (SSL*)X5
2820: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2830: 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53  _ex_data(ctx, SS
2840: 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35  L_get_ex_data_X5
2850: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78  09_STORE_CTX_idx
2860: 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a  ());.    X509  *
2870: 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f  cert..= X509_STO
2880: 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65  RE_CTX_get_curre
2890: 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20  nt_cert(ctx);.  
28a0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
28b0: 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r.= (State*)SSL_
28c0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c  get_app_data(ssl
28d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
28e0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
28f0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
2900: 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58    int depth..= X
2910: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
2920: 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74  t_error_depth(ct
2930: 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09  x);.    int err.
2940: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
2950: 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29  X_get_error(ctx)
2960: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2970: 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29  Verify: %d", ok)
2980: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2990: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
29a0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
29b0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66  if (statePtr->vf
29c0: 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46  lags & SSL_VERIF
29d0: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
29e0: 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72  R_CERT) {..    r
29f0: 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73  eturn ok;..} els
2a00: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e {..    return 
2a10: 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  1;..}.    } else
2a20: 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c   if (cert == NUL
2a30: 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c  L || ssl == NULL
2a40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
2a50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2a60: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
2a70: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
2a80: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2a90: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
2aa0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
2ab0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2ac0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2ad0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2ae0: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31  Obj("verify", -1
2af0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2b00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b10: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2b20: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2b30: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2b40: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2b50: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2b60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2b70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2b80: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2b90: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b  wIntObj(depth));
2ba0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2bb0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2bc0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c  terp, cmdPtr, Tl
2bd0: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
2be0: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20  erp, cert));.   
2bf0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c10: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2c20: 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20  wIntObj(ok));.  
2c30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2c40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2c50: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f  p, cmdPtr,..Tcl_
2c60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
2c70: 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f  ar*)X509_verify_
2c80: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
2c90: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20  g(err), -1));.. 
2ca0: 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f     /* Prevent I/
2cb0: 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b  O while callback
2cc0: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
2cd0: 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  */.    /* stateP
2ce0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
2cf0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a  _TCL_CALLBACK; *
2d00: 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  /..    /* Eval c
2d10: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
2d20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
2d30: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2d40: 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61  .    ok = EvalCa
2d50: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
2d60: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
2d70: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
2d80: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2d90: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2da0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53  ->flags &= ~(TLS
2db0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20  _TCL_CALLBACK); 
2dc0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b  */.    return(ok
2dd0: 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74  );./* By default
2de0: 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61  , leave verifica
2df0: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20  tion unchanged. 
2e00: 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  */.}.../*. *----
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e50: 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20   *. * Tls_Error 
2e60: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63  --. *. *.Calls c
2e70: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73  allback with lis
2e80: 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a  t of errors.. *.
2e90: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
2ea0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
2eb0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
2ec0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
2ed0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
2ee0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
2ef0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
2f00: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
2f10: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45  -. */.void.Tls_E
2f70: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74  rror(State *stat
2f80: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29  ePtr, char *msg)
2f90: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
2fa0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
2fb0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
2fc0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
2fd0: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
2fe0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65   unsigned long e
2ff0: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rr;.    statePtr
3000: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20  ->err = msg;..  
3010: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3020: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
3030: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
3040: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
3050: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
3060: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3070: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
3080: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3090: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
30a0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
30b0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
30c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
30d0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
30e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
30f0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
3100: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3110: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3120: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3130: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3140: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
3150: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
3160: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
3170: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
3180: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
31a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
31b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
31c0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
31d0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
31e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
31f0: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52  mObj(Tcl_GetObjR
3200: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28  esult(interp), (
3210: 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c  Tcl_Size *) NULL
3220: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) != NULL) {..T
3230: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3240: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3250: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3260: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
3270: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
3280: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c  {..listPtr = Tcl
3290: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
32a0: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65  ULL);..while ((e
32b0: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72  rr = ERR_get_err
32c0: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20  or()) != 0) {.. 
32d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
32e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
32f0: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
3300: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52  _NewStringObj(ER
3310: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
3320: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
3330: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ;..}..Tcl_ListOb
3340: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3350: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c  nterp, cmdPtr, l
3360: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  istPtr);.    }..
3370: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
3380: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
3390: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
33a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
33b0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
33c0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
33d0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
33e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
33f0: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
3400: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
3450: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
3460: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
3470: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
3480: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
3490: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
34a0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
34f0: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c  .void KeyLogCall
3500: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
3510: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ssl, const char 
3520: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61  *line) {.    cha
3530: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28  r *str = getenv(
3540: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a  SSLKEYLOGFILE);.
3550: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20      FILE *fd;.  
3560: 20 20 28 76 6f 69 64 20 2a 29 20 73 73 6c 3b 0a    (void *) ssl;.
3570: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
3580: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
3590: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f  (str) {..fd = fo
35a0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09  pen(str, "a");..
35b0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c  fprintf(fd, "%s\
35c0: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73  n",line);..fclos
35d0: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  e(fd);.    }.}..
35e0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3630: 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63  Password Callbac
3640: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  k --. *. *.Calle
3650: 64 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72  d when a passwor
3660: 64 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20  d for a private 
3670: 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72  key loading/stor
3680: 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72  ing a PEM. *.cer
3690: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
36a0: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
36b0: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
36c0: 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74  and returns. *.t
36d0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
36e0: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
36f0: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3700: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3710: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3720: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3730: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
3740: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
3750: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
3760: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
3770: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
3780: 20 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 2f 0a 73 74 61  --------. */.sta
37d0: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
37e0: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
37f0: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3800: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3810: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3820: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
3830: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
3840: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3850: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
3860: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
3870: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
3880: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20      int code;.. 
3890: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
38a0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ed");..    /* If
38b0: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73   no callback, us
38c0: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61  e default callba
38d0: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  ck */.    if (st
38e0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
38f0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
3900: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
3910: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
3920: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
3930: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c  L_GLOBAL) == TCL
3940: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  _OK) {..    char
3950: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3960: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
3970: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20  sult(interp);.. 
3980: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20     strncpy(buf, 
3990: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69  ret, (size_t) si
39a0: 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  ze);..    return
39b0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74   (int)strlen(ret
39c0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
39d0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
39e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
39f0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3a00: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
3a10: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
3a20: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
3a30: 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54  password);.    T
3a40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3a50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3a60: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3a70: 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f  tringObj("passwo
3a80: 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  rd", -1));.    T
3a90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3aa0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3ab0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
3ac0: 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a  ntObj(rwflag));.
3ad0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3ae0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3af0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3b00: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29  _NewIntObj(size)
3b10: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
3b20: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
3b30: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
3b40: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3b50: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3b60: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
3b70: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
3b80: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
3b90: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3ba0: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
3bb0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
3bc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
3bd0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
3be0: 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43    if (code != TC
3bf0: 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c  L_OK) {.#if (TCL
3c00: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
3c10: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
3c20: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
3c30: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3c40: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
3c50: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
3c60: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
3c70: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
3c80: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  if.    }.    Tcl
3c90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3ca0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  dPtr);..    Tcl_
3cb0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3cc0: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3cd0: 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65  .    /* If succe
3ce0: 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b  ssful, pass back
3cf0: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3d00: 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66   and truncate if
3d10: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20   too long */.   
3d20: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
3d30: 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65  _OK) {..Tcl_Size
3d40: 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74   len;..char *ret
3d50: 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f   = (char *) Tcl_
3d60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
3d70: 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c  (Tcl_GetObjResul
3d80: 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29  t(interp), &len)
3d90: 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63  ;..if (len > (Tc
3da0: 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20  l_Size) size-1) 
3db0: 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63  {..    len = (Tc
3dc0: 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a  l_Size) size-1;.
3dd0: 09 7d 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c  .}..strncpy(buf,
3de0: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c   ret, (size_t) l
3df0: 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d  en);..buf[len] =
3e00: 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65   '\0';..Tcl_Rele
3e10: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
3e20: 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72   interp);..retur
3e30: 6e 28 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20  n((int) len);.  
3e40: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65    }.    Tcl_Rele
3e50: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
3e60: 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65   interp);.    re
3e70: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a  turn -1;.}.../*.
3e80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73  -----. *. * Sess
3ed0: 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ion Callback for
3ee0: 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20   Clients --. *. 
3ef0: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.Called when a 
3f00: 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61  new session is a
3f10: 64 64 65 64 20 74 6f 20 74 68 65 20 63 61 63 68  dded to the cach
3f20: 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a  e. In TLS 1.3. *
3f30: 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 65 63  .this may be rec
3f40: 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  eived multiple t
3f50: 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 20 68  imes after the h
3f60: 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a  andshake. For. *
3f70: 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e  .earlier version
3f80: 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
3f90: 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67 20  received during 
3fa0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20  the handshake.. 
3fb0: 2a 09 54 68 69 73 20 69 73 20 74 68 65 20 70 72  *.This is the pr
3fc0: 65 66 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f  eferred way to o
3fd0: 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c  btain a resumabl
3fe0: 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a  e session.. *. *
3ff0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
4000: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
4010: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
4020: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
4030: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
4040: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20  n codes:. *.0 = 
4050: 65 72 72 6f 72 20 77 68 65 72 65 20 73 65 73 73  error where sess
4060: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65  ion will be imme
4070: 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20  diately removed 
4080: 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61  from the interna
4090: 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20  l cache.. *.1 = 
40a0: 73 75 63 63 65 73 73 20 77 68 65 72 65 20 61 70  success where ap
40b0: 70 20 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f  p retains sessio
40c0: 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63  n in session cac
40d0: 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c  he, and must cal
40e0: 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72  l SSL_SESSION_fr
40f0: 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a  ee() when done..
4100: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
4150: 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43  tic int.SessionC
4160: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
4170: 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53  L *ssl, SSL_SESS
4180: 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a  ION *session) {.
4190: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
41a0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr = (State*)SS
41b0: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28  L_get_app_data((
41c0: 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20  SSL *)ssl);.    
41d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
41e0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
41f0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4200: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4210: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4220: 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20  har *ticket;.   
4230: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4240: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64  char *session_id
4250: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ;.    size_t len
4260: 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  2;.    unsigned 
4270: 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64  int ulen;..    d
4280: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
4290: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
42a0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
42b0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
42c0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
42d0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
42e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c    } else if (ssl
42f0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
4300: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4310: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4320: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
4330: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a  ommand to eval *
4340: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
4350: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
4360: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
4370: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
4380: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4390: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
43a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
43b0: 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31  bj("session", -1
43c0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
43d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
43e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
43f0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
4400: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
4410: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
4420: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
4430: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
4440: 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69   id */.    sessi
4450: 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
4460: 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69  ION_get_id(sessi
4470: 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20  on, &ulen);.    
4480: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4490: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
44a0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
44b0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73  ByteArrayObj(ses
44c0: 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69  sion_id, (Tcl_Si
44d0: 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20  ze) ulen));..   
44e0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b   /* Session tick
44f0: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45  et */.    SSL_SE
4500: 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
4510: 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
4520: 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20  et, &len2);.    
4530: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4540: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4550: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
4560: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63  ByteArrayObj(tic
4570: 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ket, (Tcl_Size) 
4580: 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  len2));..    /* 
4590: 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65  Lifetime - numbe
45a0: 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  r of seconds */.
45b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
45c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
45d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63  erp, cmdPtr,..Tc
45e0: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f  l_NewLongObj((lo
45f0: 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  ng) SSL_SESSION_
4600: 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
4610: 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
4620: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  )));..    /* Eva
4630: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
4640: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
4650: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
4660: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
4670: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
4680: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
4690: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
46a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
46b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
46c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
4710: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  LPN Callback for
4720: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e   Servers and NPN
4730: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
4740: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  ients --. *. *.P
4750: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20  erform protocol 
4760: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  (http/1.1, h2, h
4770: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69  3, etc.) selecti
4780: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e  on for the. *.in
4790: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
47a0: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  n. Called after 
47b0: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72  Hello and server
47c0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57   callbacks.. *.W
47d0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
47e0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
47f0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
4800: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
4810: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
4820: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4830: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4840: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4850: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4860: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4870: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4880: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
4890: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
48a0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
48b0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
48c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
48d0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
48e0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
48f0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
4900: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
4910: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
4920: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
4930: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
4940: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
4950: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
4960: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
4970: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
4980: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
4990: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
49a0: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
49b0: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
49c0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
49d0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
49e0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
49f0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4a40: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
4a50: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
4a60: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
4a70: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
4a80: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
4a90: 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20  *outlen,..const 
4aa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
4ab0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  n, unsigned int 
4ac0: 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67  inlen, void *arg
4ad0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
4ae0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
4af0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
4b00: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
4b10: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
4b20: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
4b30: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
4b40: 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64  ode, res;..    d
4b50: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
4b60: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
4b70: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
4b80: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
4b90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4ba0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4bb0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74    /* Select prot
4bc0: 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  ocol */.    if (
4bd0: 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f  SSL_select_next_
4be0: 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65  proto(out, outle
4bf0: 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  n, statePtr->pro
4c00: 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  tos, statePtr->p
4c10: 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20  rotos_len,..in, 
4c20: 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53  inlen) == OPENSS
4c30: 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44  L_NPN_NEGOTIATED
4c40: 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f  ) {../* Match fo
4c50: 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53  und */..res = SS
4c60: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
4c70: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
4c80: 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f  * OPENSSL_NPN_NO
4c90: 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76  _OVERLAP = No ov
4ca0: 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69  erlap, so use fi
4cb0: 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c  rst item from cl
4cc0: 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69  ient protocol li
4cd0: 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c  st */..res = SSL
4ce0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4cf0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
4d00: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
4d10: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
4d20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65  LL) {..return re
4d30: 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  s;.    }..    /*
4d40: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
4d50: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63  to eval */.    c
4d60: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
4d70: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
4d80: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
4d90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4da0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4db0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
4dc0: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20  ringObj("alpn", 
4dd0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
4de0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4df0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4e00: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
4e10: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
4e20: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
4e30: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
4e40: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4e50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4e60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4e70: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4e80: 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20  (*out, -1));.   
4e90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4ea0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4eb0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4ec0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20  wBooleanObj(res 
4ed0: 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  == SSL_TLSEXT_ER
4ee0: 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  R_OK));..    /* 
4ef0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
4f00: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
4f10: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
4f20: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
4f30: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
4f40: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
4f50: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
4f60: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
4f70: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4f80: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  K;.    } else if
4f90: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09   (code == 1) {..
4fa0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
4fb0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65  _ERR_OK;.    } e
4fc0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
4fd0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
4fe0: 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20  T_FATAL;.    }. 
4ff0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
5000: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
5010: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
5020: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
5070: 41 64 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63  Advertise Protoc
5080: 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ols Callback for
5090: 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e   Next Protocol N
50a0: 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29  egotiation (NPN)
50b0: 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20   in ServerHello 
50c0: 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20  --. *. *.called 
50d0: 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65  when a TLS serve
50e0: 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f  r needs a list o
50f0: 66 20 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74  f supported prot
5100: 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20  ocols for Next. 
5110: 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  *.Protocol Negot
5120: 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  iation.. *. * Re
5130: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
5140: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
5150: 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  s:. *. * Return 
5160: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c  codes:. *.SSL_TL
5170: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e  SEXT_ERR_OK: NPN
5180: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
5190: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
51a0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
51b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
51c0: 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f  NOACK: NPN proto
51d0: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
51e0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
51f0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
5200: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20  ----. */.#ifdef 
5250: 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69  USE_NPN.static i
5260: 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63  nt.NPNCallback(c
5270: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
5280: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5290: 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e  ar **out, unsign
52a0: 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20  ed int *outlen, 
52b0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
52c0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
52d0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
52e0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
52f0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5300: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5310: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5320: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5330: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5340: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70   }..    /* Set p
5350: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
5360: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5370: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
5380: 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61  L) {..*out = sta
5390: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09  tePtr->protos;..
53a0: 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50  *outlen = stateP
53b0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a  tr->protos_len;.
53c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f      } else {..*o
53d0: 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74  ut = NULL;..*out
53e0: 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  len = 0;..return
53f0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5400: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  NOACK;.    }.   
5410: 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45   return SSL_TLSE
5420: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e  XT_ERR_OK;.}.#en
5430: 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  dif.../*. *-----
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5480: 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63  *. * SNI Callbac
5490: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d  k for Servers --
54a0: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73  . *. *.Perform s
54b0: 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68  erver-side SNI h
54c0: 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f  ostname selectio
54d0: 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e  n after receivin
54e0: 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a  g SNI extension.
54f0: 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c   *.in Client Hel
5500: 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72  lo. Called after
5510: 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20   hello callback 
5520: 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20  but before ALPN 
5530: 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20  callback.. *. * 
5540: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
5550: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5560: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
5570: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
5580: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
5590: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54   codes:. *.SSL_T
55a0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e  LSEXT_ERR_OK: SN
55b0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63  I hostname is ac
55c0: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  cepted. The conn
55d0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
55e0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
55f0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a  ERR_ALERT_FATAL:
5600: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
5610: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54   not accepted. T
5620: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a  he connection. *
5630: 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e  .    is aborted.
5640: 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65   Default for ale
5650: 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52  rt is SSL_AD_UNR
5660: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a  ECOGNIZED_NAME..
5670: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5680: 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a  R_ALERT_WARNING:
5690: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
56a0: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77   not accepted, w
56b0: 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09  arning alert. *.
56c0: 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75      sent (not su
56d0: 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31  pported in TLSv1
56e0: 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  .3). The connect
56f0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5700: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5710: 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74  _NOACK: SNI host
5720: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65  name is not acce
5730: 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b  pted and not ack
5740: 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20  nowledged,. *.  
5750: 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61    e.g. if SNI ha
5760: 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69  s not been confi
5770: 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  gured. The conne
5780: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5790: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
57e0: 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c  atic int.SNICall
57f0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
5800: 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c  ssl, int *alert,
5810: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
5820: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
5830: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
5840: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
5850: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
5860: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
5870: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
5880: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
5890: 65 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65  es;.    char *se
58a0: 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  rvername = NULL;
58b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
58c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
58d0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
58e0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
58f0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5900: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5910: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
5920: 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31   works for TLS 1
5930: 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a  .2 and earlier *
5940: 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  /.    servername
5950: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65   = SSL_get_serve
5960: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
5970: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
5980: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21  name);.    if (!
5990: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65  servername || se
59a0: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27  rvername[0] == '
59b0: 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  \0') {..return S
59c0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
59d0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
59e0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
59f0: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
5a00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5a10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5a20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5a30: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
5a40: 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63  to eval */.    c
5a50: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
5a60: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
5a70: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
5a80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5a90: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5aa0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
5ab0: 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d  ringObj("sni", -
5ac0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5ad0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5ae0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5af0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
5b00: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
5b10: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
5b20: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
5b30: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5b40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5b50: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
5b60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5b70: 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29  servername , -1)
5b80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
5b90: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
5ba0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
5bb0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5bc0: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20  ;.    if ((code 
5bd0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69  = EvalCallback(i
5be0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
5bf0: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b   cmdPtr)) > 1) {
5c00: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5c10: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
5c20: 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  NING;..*alert = 
5c30: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
5c40: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74  ZED_NAME; /* Not
5c50: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c   supported by TL
5c60: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65  S 1.3 */.    } e
5c70: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
5c80: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5c90: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
5ca0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
5cb0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5cc0: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09  R_ALERT_FATAL;..
5cd0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f  *alert = SSL_AD_
5ce0: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5cf0: 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72  E; /* Not suppor
5d00: 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a  ted by TLS 1.3 *
5d10: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  /.    }.    Tcl_
5d20: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
5d30: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
5d40: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48  --. *. * ClientH
5da0: 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43  ello Handshake C
5db0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
5dc0: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65  ers --. *. *.Use
5dd0: 64 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65  d by server to e
5de0: 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65  xamine the serve
5df0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
5e00: 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f  n (SNI) extensio
5e10: 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79  n. *.provided by
5e20: 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f   the client in o
5e30: 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61  rder to select a
5e40: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65  n appropriate ce
5e50: 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09  rtificate to. *.
5e60: 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b  present, and mak
5e70: 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72  e other configur
5e80: 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74  ation adjustment
5e90: 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68  s relevant to th
5ea0: 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d  at server. *.nam
5eb0: 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67  e and its config
5ec0: 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e  uration. This in
5ed0: 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20  cludes swapping 
5ee0: 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  out the associat
5ef0: 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f  ed. *.SSL_CTX po
5f00: 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67  inter, modifying
5f10: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69   the server's li
5f20: 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20  st of permitted 
5f30: 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a  TLS versions,. *
5f40: 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65  .changing the se
5f50: 72 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69  rver's cipher li
5f60: 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  st in response t
5f70: 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63  o the client's c
5f80: 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e  ipher list, etc.
5f90: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72  . *.Called befor
5fa0: 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63  e SNI and ALPN c
5fb0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20  allbacks.. *. * 
5fc0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
5fd0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5fe0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
5ff0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
6000: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
6010: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43   codes:. *.SSL_C
6020: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6030: 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65 20 68  Y: suspend the h
6040: 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68  andshake, and th
6050: 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63  e handshake func
6060: 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e  tion will return
6070: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09   immediately. *.
6080: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6090: 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c  _ERROR: failure,
60a0: 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65   terminate conne
60b0: 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74  ction. Set alert
60c0: 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   to error code..
60d0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
60e0: 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63  LLO_SUCCESS: suc
60f0: 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  cess. *. *------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c  /.static int.Hel
6150: 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  loCallback(const
6160: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a   SSL *ssl, int *
6170: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67  alert, void *arg
6180: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
6190: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
61a0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
61b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
61c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
61d0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
61e0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
61f0: 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f  ode, res;.    co
6200: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72  nst char *server
6210: 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  name;.    const 
6220: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
6230: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ;.    size_t len
6240: 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20  , remaining;..  
6250: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
6260: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
6270: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
6280: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
6290: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
62a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
62b0: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  SS;.    } else i
62c0: 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74  f (ssl == (const
62d0: 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61   SSL *)NULL || a
62e0: 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55  rg == (void *)NU
62f0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
6300: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6310: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
6320: 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f   /* Get names */
6330: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c  .    if (!SSL_cl
6340: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f  ient_hello_get0_
6350: 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ext(ssl, TLSEXT_
6360: 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65  TYPE_server_name
6370: 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67  , &p, &remaining
6380: 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c  ) || remaining <
6390: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  = 2) {..*alert =
63a0: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45   SSL_R_SSLV3_ALE
63b0: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d  RT_ILLEGAL_PARAM
63c0: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  ETER;..return SS
63d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
63e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
63f0: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
6400: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75  length of the su
6410: 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e  pplied list of n
6420: 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e  ames. */.    len
6430: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29   = (*(p++) << 8)
6440: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70  ;.    len += *(p
6450: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e  ++);.    if (len
6460: 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e   + 2 != remainin
6470: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  g) {..*alert = S
6480: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54  SL_R_SSLV3_ALERT
6490: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54  _ILLEGAL_PARAMET
64a0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ER;..return SSL_
64b0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
64c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
64d0: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a  maining = len;..
64e0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
64f0: 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79  in practice only
6500: 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c   has a single el
6510: 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c  ement, so we onl
6520: 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  y consider the f
6530: 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20  irst one. */.   
6540: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d   if (remaining =
6550: 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54  = 0 || *p++ != T
6560: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
6570: 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c  ost_name) {..*al
6580: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6590: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
65a0: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
65b0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
65c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
65d0: 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a    remaining--;..
65e0: 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61      /* Now we ca
65f0: 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f  n finally pull o
6600: 75 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61  ut the byte arra
6610: 79 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61  y with the actua
6620: 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20  l hostname. */. 
6630: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67     if (remaining
6640: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74   <= 2) {..*alert
6650: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6660: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6670: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6680: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6690: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  ROR;.    }.    l
66a0: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20  en = (*(p++) << 
66b0: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a  8);.    len += *
66c0: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c  (p++);.    if (l
66d0: 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69  en + 2 > remaini
66e0: 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20  ng) {..*alert = 
66f0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6700: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6710: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6720: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
6740: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20  ining = len;.   
6750: 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63   servername = (c
6760: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a  onst char *)p;..
6770: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
6780: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
6790: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
67a0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
67b0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
67c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
67d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
67e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
67f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68  _NewStringObj("h
6800: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  ello", -1));.   
6810: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6820: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6830: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
6840: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6850: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
6860: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
6870: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
6880: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6890: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
68a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
68b0: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
68c0: 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  me, (Tcl_Size) l
68d0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
68e0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
68f0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6900: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6910: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6920: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6930: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6940: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6950: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6960: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6970: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6980: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
6990: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
69a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
69b0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
69c0: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
69d0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
69e0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
69f0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6a00: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6a10: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6a20: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6a30: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6a40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6a50: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6a60: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a80: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6a90: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6ab0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6b00: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
6b10: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63   --. *. *.This c
6b20: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
6b30: 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72  o verify whether
6b40: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69   the handshake i
6b50: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72  s complete. *.or
6b60: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   not.. *. * Resu
6b70: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6b80: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31  rd Tcl result. 1
6b90: 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65   means handshake
6ba0: 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61   complete, 0 mea
6bb0: 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20  ns pending.. *. 
6bc0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6bd0: 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c   *.May force SSL
6be0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20   negotiation to 
6bf0: 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20  take place.. *. 
6c00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
6c50: 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  int HandshakeObj
6c60: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
6c70: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
6c80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
6c90: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
6ca0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
6cb0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
6cc0: 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f  l chan;        /
6cd0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
6ce0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
6cf0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
6d00: 61 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f  atePtr;        /
6d10: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
6d20: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
6d30: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6d40: 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *errStr = NULL;.
6d50: 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b      int ret = 1;
6d60: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30  .    int err = 0
6d70: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
6d80: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
6d90: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6da0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
6db0: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
6dc0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
6dd0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
6de0: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  el");..return(TC
6df0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
6e00: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
6e10: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61  rror();..    cha
6e20: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
6e30: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
6e40: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6e50: 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69  objv[1], (Tcl_Si
6e60: 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c  ze *) NULL), NUL
6e70: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
6e80: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
6e90: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
6ea0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
6eb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
6ec0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
6ed0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
6ee0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
6ef0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
6f00: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
6f10: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
6f20: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
6f30: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
6f40: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
6f50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6f60: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
6f70: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
6f80: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
6f90: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
6fa0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
6fb0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
6fc0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
6fd0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
6fe0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
6ff0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
7000: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54  NULL);..return(T
7010: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
7020: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
7030: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
7040: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
7050: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
7060: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
7070: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
7080: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d  ect");.    ret =
7090: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
70a0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65  ect(statePtr, &e
70b0: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69  rr, 1);.    dpri
70c0: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72  ntf("Tls_WaitFor
70d0: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64  Connect returned
70e0: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20  : %i", ret);..  
70f0: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26    if (ret < 0 &&
7100: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61   ((statePtr->fla
7110: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59  gs & TLS_TCL_ASY
7120: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45  NC) && (err == E
7130: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69  AGAIN))) {..dpri
7140: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61  ntf("Async set a
7150: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22  nd err = EAGAIN"
7160: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20  );..ret = 0;.   
7170: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20   } else if (ret 
7180: 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73  < 0) {..long res
7190: 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73  ult;..errStr = s
71a0: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54  tatePtr->err;..T
71b0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
71c0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74  nterp);..Tcl_Set
71d0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66  Errno(err);...if
71e0: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65   (!errStr || (*e
71f0: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09  rrStr == 0)) {..
7200: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c      errStr = Tcl
7210: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
7220: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70  rp);..}...Tcl_Ap
7230: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7240: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61  p, "handshake fa
7250: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c  iled: ", errStr,
7260: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7270: 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20  ..if ((result = 
7280: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
7290: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
72a0: 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f  ssl)) != X509_V_
72b0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  OK) {..    Tcl_A
72c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
72d0: 72 70 2c 20 22 20 64 75 65 20 74 6f 3a 20 22 2c  rp, " due to: ",
72e0: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
72f0: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
7300: 65 73 75 6c 74 29 2c 20 28 63 68 61 72 20 2a 29  esult), (char *)
7310: 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f   NULL);..}..Tcl_
7320: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
7330: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e  erp, "TLS", "HAN
7340: 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44  DSHAKE", "FAILED
7350: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
7360: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74  );..dprintf("Ret
7370: 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52  urning TCL_ERROR
7380: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20   with handshake 
7390: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72  failed: %s", err
73a0: 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  Str);..return(TC
73b0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20  L_ERROR);.    } 
73c0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20  else {..if (err 
73d0: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72  != 0) {..    dpr
73e0: 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72  intf("Got an err
73f0: 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65  or with a comple
7400: 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65  ted handshake: e
7410: 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a  rr = %i", err);.
7420: 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20  .}..ret = 1;.   
7430: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
7440: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f  "Returning TCL_O
7450: 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69  K with data \"%i
7460: 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54  \"", ret);.    T
7470: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
7480: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
7490: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20  ntObj(ret));.   
74a0: 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b   return(TCL_OK);
74b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
74c0: 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f 6f   char *command_o
74d0: 70 74 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  pts [] = {.    "
74e0: 2d 61 6c 70 6e 22 2c 20 22 2d 63 61 64 69 72 22  -alpn", "-cadir"
74f0: 2c 20 22 2d 63 61 66 69 6c 65 22 2c 20 22 2d 63  , "-cafile", "-c
7500: 65 72 74 22 2c 20 22 2d 63 65 72 74 66 69 6c 65  ert", "-certfile
7510: 22 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 22 2d  ", "-cipher", "-
7520: 63 69 70 68 65 72 73 22 2c 20 22 2d 63 69 70 68  ciphers", "-ciph
7530: 65 72 73 75 69 74 65 73 22 2c 0a 20 20 20 20 22  ersuites",.    "
7540: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 64 68 70  -command", "-dhp
7550: 61 72 61 6d 73 22 2c 20 22 2d 6b 65 79 22 2c 20  arams", "-key", 
7560: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 22 2d 6d 6f  "-keyfile", "-mo
7570: 64 65 6c 22 2c 20 22 2d 70 61 73 73 77 6f 72 64  del", "-password
7580: 22 2c 20 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68  ", "-post_handsh
7590: 61 6b 65 22 2c 0a 20 20 20 20 22 2d 72 65 71 75  ake",.    "-requ
75a0: 65 73 74 22 2c 20 22 2d 72 65 71 75 69 72 65 22  est", "-require"
75b0: 2c 20 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76  , "-security_lev
75c0: 65 6c 22 2c 20 22 2d 73 65 72 76 65 72 22 2c 20  el", "-server", 
75d0: 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 22  "-servername", "
75e0: 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 22 2d  -session_id", "-
75f0: 73 73 6c 32 22 2c 0a 20 20 20 20 22 2d 73 73 6c  ssl2",.    "-ssl
7600: 33 22 2c 20 22 2d 74 6c 73 31 22 2c 20 22 2d 74  3", "-tls1", "-t
7610: 6c 73 31 2e 31 22 2c 20 22 2d 74 6c 73 31 2e 32  ls1.1", "-tls1.2
7620: 22 2c 20 22 2d 74 6c 73 31 2e 33 22 2c 20 22 2d  ", "-tls1.3", "-
7630: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22  validatecommand"
7640: 2c 20 22 2d 76 63 6d 64 22 2c 20 4e 55 4c 4c 7d  , "-vcmd", NULL}
7650: 3b 0a 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e 64  ;..enum _command
7660: 5f 6f 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70 74  _opts {.    _opt
7670: 5f 61 6c 70 6e 2c 20 5f 6f 70 74 5f 63 61 64 69  _alpn, _opt_cadi
7680: 72 2c 20 5f 6f 70 74 5f 63 61 66 69 6c 65 2c 20  r, _opt_cafile, 
7690: 5f 6f 70 74 5f 63 65 72 74 2c 20 5f 6f 70 74 5f  _opt_cert, _opt_
76a0: 63 65 72 74 66 69 6c 65 2c 20 5f 6f 70 74 5f 63  certfile, _opt_c
76b0: 69 70 68 65 72 2c 20 5f 6f 70 74 5f 63 69 70 68  ipher, _opt_ciph
76c0: 65 72 73 2c 0a 20 20 20 20 5f 6f 70 74 5f 63 69  ers,.    _opt_ci
76d0: 70 68 65 72 73 75 69 74 65 2c 20 5f 6f 70 74 5f  phersuite, _opt_
76e0: 63 6d 64 2c 20 5f 6f 70 74 5f 64 68 70 61 72 61  cmd, _opt_dhpara
76f0: 6d 73 2c 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f  ms, _opt_key, _o
7700: 70 74 5f 6b 65 79 66 69 6c 65 2c 20 5f 6f 70 74  pt_keyfile, _opt
7710: 5f 6d 6f 64 65 6c 2c 20 5f 6f 70 74 5f 70 61 73  _model, _opt_pas
7720: 73 77 6f 72 64 2c 0a 20 20 20 20 5f 6f 70 74 5f  sword,.    _opt_
7730: 68 61 6e 64 73 68 61 6b 65 2c 20 5f 6f 70 74 5f  handshake, _opt_
7740: 72 65 71 75 65 73 74 2c 20 5f 6f 70 74 5f 72 65  request, _opt_re
7750: 71 75 69 72 65 2c 20 5f 6f 70 74 5f 73 65 63 75  quire, _opt_secu
7760: 72 69 74 79 5f 6c 65 76 65 6c 2c 20 5f 6f 70 74  rity_level, _opt
7770: 5f 73 65 72 76 65 72 2c 20 5f 6f 70 74 5f 73 65  _server, _opt_se
7780: 72 76 65 72 6e 61 6d 65 2c 0a 20 20 20 20 5f 6f  rvername,.    _o
7790: 70 74 5f 73 65 73 73 69 6f 6e 5f 69 64 2c 20 5f  pt_session_id, _
77a0: 6f 70 74 5f 73 73 6c 32 2c 20 5f 6f 70 74 5f 73  opt_ssl2, _opt_s
77b0: 73 6c 33 2c 20 5f 6f 70 74 5f 74 6c 73 31 2c 20  sl3, _opt_tls1, 
77c0: 5f 6f 70 74 5f 74 6c 73 31 31 2c 20 5f 6f 70 74  _opt_tls11, _opt
77d0: 5f 74 6c 73 31 32 2c 20 5f 6f 70 74 5f 74 6c 73  _tls12, _opt_tls
77e0: 31 33 2c 0a 20 20 20 20 5f 6f 70 74 5f 76 61 6c  13,.    _opt_val
77f0: 69 64 61 74 65 2c 20 5f 6f 70 74 5f 76 63 6d 64  idate, _opt_vcmd
7800: 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .};../*. *------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7850: 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  . * ImportObjCmd
7860: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
7870: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
7880: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
7890: 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64  he "ssl" command
78a0: 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63  . *. *.The ssl c
78b0: 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53  ommand pushes SS
78c0: 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20  L over a (newly 
78d0: 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73  connected) tcp s
78e0: 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75  ocket. *. * Resu
78f0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
7900: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
7910: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
7920: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
7930: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
7940: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
7950: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7990: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
79a0: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62  tic int.ImportOb
79b0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
79c0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
79d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
79e0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
79f0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
7a00: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
7a10: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
7a20: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
7a30: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
7a40: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
7a50: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
7a60: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
7a70: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  et */.    SSL_CT
7a80: 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d  X *ctx.        =
7a90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
7aa0: 62 6a 20 2a 63 6d 64 4f 62 6a 09 20 20 20 20 20  bj *cmdObj.     
7ab0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
7ac0: 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 64 4f 62  cl_Obj *passwdOb
7ad0: 6a 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  j.        = NULL
7ae0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  ;.    Tcl_Obj *v
7af0: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55  cmd.        = NU
7b00: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
7b10: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
7b20: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
7b30: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
7b40: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
7b50: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
7b60: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
7b70: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54    int idx;.    T
7b80: 63 6c 5f 53 69 7a 65 20 66 6e 2c 20 6c 65 6e 3b  cl_Size fn, len;
7b90: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09  .    int flags..
7ba0: 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43          = TLS_TC
7bb0: 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20  L_INIT;.    int 
7bc0: 73 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20  server..        
7bd0: 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65  = 0;./* is conne
7be0: 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f  ction incoming o
7bf0: 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20  r outgoing? */. 
7c00: 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65     char *keyfile
7c10: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7c20: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66  .    char *certf
7c30: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
7c40: 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  LL;.    unsigned
7c50: 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e   char *key  .= N
7c60: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  ULL;.    Tcl_Siz
7c70: 65 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20  e key_len       
7c80: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20            = 0;. 
7c90: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
7ca0: 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 20 3d   *cert         =
7cb0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53   NULL;.    Tcl_S
7cc0: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 20 20 20 20  ize cert_len    
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b              = 0;
7ce0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65  .    char *ciphe
7cf0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rs.        = NUL
7d00: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  L;.    char *cip
7d10: 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20  hersuites.      
7d20: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
7d30: 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20  ar *CAfile.     
7d40: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
7d50: 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20  har *CAdir..    
7d60: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
7d70: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20  char *DHparams. 
7d80: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
7d90: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09     char *model..
7da0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7db0: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72      char *server
7dc0: 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e  name.        = N
7dd0: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
7de0: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
7df0: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20   Indication */. 
7e00: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
7e10: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
7e20: 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  id = NULL;.    T
7e30: 63 6c 5f 53 69 7a 65 20 73 65 73 73 5f 6c 65 6e  cl_Size sess_len
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  = 0;.    Tcl_Obj
7e60: 20 2a 61 6c 70 6e 4f 62 6a 09 09 3d 20 4e 55 4c   *alpnObj..= NUL
7e70: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20  L;.    int ssl2 
7e80: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20  = 0, ssl3 = 0;. 
7e90: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c     int tls1 = 1,
7ea0: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73   tls1_1 = 1, tls
7eb0: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20  1_2 = 1, tls1_3 
7ec0: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f  = 1;.    int pro
7ed0: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20  to = 0, level = 
7ee0: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69  -1;.    int veri
7ef0: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20  fy = 0, require 
7f00: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31  = 0, request = 1
7f10: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
7f20: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29   = 0;.    (void)
7f30: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
7f40: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
7f50: 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  d");..#if define
7f60: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
7f70: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7f80: 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20  _TLS1).    tls1 
7f90: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
7fa0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7fb0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
7fc0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
7fd0: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b  .    tls1_1 = 0;
7fe0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
7ff0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
8000: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
8010: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
8020: 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e   tls1_2 = 0;.#en
8030: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
8040: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
8050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8060: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73  _TLS1_3).    tls
8070: 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  1_3 = 0;.#endif.
8080: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
8090: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
80a0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
80b0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
80c0: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72   ?options?");..r
80d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
80e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
80f0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8100: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
8110: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
8120: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
8130: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
8140: 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c  (Tcl_Size *) NUL
8150: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
8160: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
8170: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
8180: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8190: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
81a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
81b0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
81c0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
81d0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
81e0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
81f0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
8200: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
8210: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 69 66  jc; idx++) {..if
8220: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
8230: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8240: 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64  jv[idx], command
8250: 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _opts, "option",
8260: 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f   0, &fn) != TCL_
8270: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
8280: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
8290: 0a 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72  ../* Validate ar
82a0: 67 20 68 61 73 20 76 61 6c 75 65 20 2a 2f 0a 09  g has value */..
82b0: 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a  if (++idx >= obj
82c0: 63 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  c) {..    Tcl_Ap
82d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
82e0: 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72  p, "No value for
82f0: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d   option \"", com
8300: 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22  mand_opts[fn], "
8310: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
8320: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
8330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
8340: 09 73 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63  .switch(fn) {..c
8350: 61 73 65 20 5f 6f 70 74 5f 61 6c 70 6e 3a 0a 09  ase _opt_alpn:..
8360: 20 20 20 20 61 6c 70 6e 4f 62 6a 20 3d 20 6f 62      alpnObj = ob
8370: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
8380: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8390: 63 61 64 69 72 3a 0a 09 20 20 20 20 47 45 54 5f  cadir:..    GET_
83a0: 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b  OPT_STRING(objv[
83b0: 69 64 78 5d 2c 20 43 41 64 69 72 2c 20 4e 55 4c  idx], CAdir, NUL
83c0: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  L);..    break;.
83d0: 09 63 61 73 65 20 5f 6f 70 74 5f 63 61 66 69 6c  .case _opt_cafil
83e0: 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  e:..    GET_OPT_
83f0: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d  STRING(objv[idx]
8400: 2c 20 43 41 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b  , CAfile, NULL);
8410: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8420: 73 65 20 5f 6f 70 74 5f 63 65 72 74 3a 0a 09 20  se _opt_cert:.. 
8430: 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f     GET_OPT_BYTE_
8440: 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c  ARRAY(objv[idx],
8450: 20 63 65 72 74 2c 20 26 63 65 72 74 5f 6c 65 6e   cert, &cert_len
8460: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8470: 63 61 73 65 20 5f 6f 70 74 5f 63 65 72 74 66 69  case _opt_certfi
8480: 6c 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  le:..    GET_OPT
8490: 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78  _STRING(objv[idx
84a0: 5d 2c 20 63 65 72 74 66 69 6c 65 2c 20 4e 55 4c  ], certfile, NUL
84b0: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  L);..    break;.
84c0: 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65  .case _opt_ciphe
84d0: 72 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69  r:..case _opt_ci
84e0: 70 68 65 72 73 3a 0a 09 20 20 20 20 47 45 54 5f  phers:..    GET_
84f0: 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b  OPT_STRING(objv[
8500: 69 64 78 5d 2c 20 63 69 70 68 65 72 73 2c 20 4e  idx], ciphers, N
8510: 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ULL);..    break
8520: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70  ;..case _opt_cip
8530: 68 65 72 73 75 69 74 65 3a 0a 09 20 20 20 20 47  hersuite:..    G
8540: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
8550: 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68 65 72 73  jv[idx], ciphers
8560: 75 69 74 65 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20  uites, NULL);.. 
8570: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8580: 5f 6f 70 74 5f 63 6d 64 3a 0a 09 20 20 20 20 63  _opt_cmd:..    c
8590: 6d 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78  mdObj = objv[idx
85a0: 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ];..    break;..
85b0: 63 61 73 65 20 5f 6f 70 74 5f 64 68 70 61 72 61  case _opt_dhpara
85c0: 6d 73 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  ms:..    GET_OPT
85d0: 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78  _STRING(objv[idx
85e0: 5d 2c 20 44 48 70 61 72 61 6d 73 2c 20 4e 55 4c  ], DHparams, NUL
85f0: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  L);..    break;.
8600: 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a  .case _opt_key:.
8610: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54  .    GET_OPT_BYT
8620: 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78  E_ARRAY(objv[idx
8630: 5d 2c 20 6b 65 79 2c 20 26 6b 65 79 5f 6c 65 6e  ], key, &key_len
8640: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8650: 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 66 69 6c  case _opt_keyfil
8660: 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  e:..    GET_OPT_
8670: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d  STRING(objv[idx]
8680: 2c 20 6b 65 79 66 69 6c 65 2c 20 4e 55 4c 4c 29  , keyfile, NULL)
8690: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
86a0: 61 73 65 20 5f 6f 70 74 5f 6d 6f 64 65 6c 3a 0a  ase _opt_model:.
86b0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52  .    GET_OPT_STR
86c0: 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6d  ING(objv[idx], m
86d0: 6f 64 65 6c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  odel, NULL);..  
86e0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
86f0: 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20  opt_password:.. 
8700: 20 20 20 70 61 73 73 77 64 4f 62 6a 20 3d 20 6f     passwdObj = o
8710: 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62  bjv[idx];..    b
8720: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8730: 5f 68 61 6e 64 73 68 61 6b 65 3a 0a 09 20 20 20  _handshake:..   
8740: 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62   GET_OPT_BOOL(ob
8750: 6a 76 5b 69 64 78 5d 2c 20 26 70 6f 73 74 5f 68  jv[idx], &post_h
8760: 61 6e 64 73 68 61 6b 65 29 3b 0a 09 20 20 20 20  andshake);..    
8770: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8780: 74 5f 72 65 71 75 65 73 74 3a 0a 09 20 20 20 20  t_request:..    
8790: 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a  GET_OPT_BOOL(obj
87a0: 76 5b 69 64 78 5d 2c 20 26 72 65 71 75 65 73 74  v[idx], &request
87b0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
87c0: 63 61 73 65 20 5f 6f 70 74 5f 72 65 71 75 69 72  case _opt_requir
87d0: 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  e:..    GET_OPT_
87e0: 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  BOOL(objv[idx], 
87f0: 26 72 65 71 75 69 72 65 29 3b 0a 09 20 20 20 20  &require);..    
8800: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8810: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
8820: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49  :..    GET_OPT_I
8830: 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 6c  NT(objv[idx], &l
8840: 65 76 65 6c 29 3b 0a 09 20 20 20 20 62 72 65 61  evel);..    brea
8850: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65  k;..case _opt_se
8860: 72 76 65 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f  rver:..    GET_O
8870: 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78  PT_BOOL(objv[idx
8880: 5d 2c 20 26 73 65 72 76 65 72 29 3b 0a 09 20 20  ], &server);..  
8890: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
88a0: 6f 70 74 5f 73 65 72 76 65 72 6e 61 6d 65 3a 0a  opt_servername:.
88b0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52  .    GET_OPT_STR
88c0: 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73  ING(objv[idx], s
88d0: 65 72 76 65 72 6e 61 6d 65 2c 20 4e 55 4c 4c 29  ervername, NULL)
88e0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
88f0: 61 73 65 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e  ase _opt_session
8900: 5f 69 64 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  _id:..    GET_OP
8910: 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a  T_BYTE_ARRAY(obj
8920: 76 5b 69 64 78 5d 2c 20 73 65 73 73 69 6f 6e 5f  v[idx], session_
8930: 69 64 2c 20 26 73 65 73 73 5f 6c 65 6e 29 3b 0a  id, &sess_len);.
8940: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8950: 65 20 5f 6f 70 74 5f 73 73 6c 32 3a 0a 09 20 20  e _opt_ssl2:..  
8960: 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62    GET_OPT_INT(ob
8970: 6a 76 5b 69 64 78 5d 2c 20 26 73 73 6c 32 29 3b  jv[idx], &ssl2);
8980: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8990: 73 65 20 5f 6f 70 74 5f 73 73 6c 33 3a 0a 09 20  se _opt_ssl3:.. 
89a0: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f     GET_OPT_INT(o
89b0: 62 6a 76 5b 69 64 78 5d 2c 20 26 73 73 6c 33 29  bjv[idx], &ssl3)
89c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
89d0: 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31 3a 0a 09  ase _opt_tls1:..
89e0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
89f0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31  objv[idx], &tls1
8a00: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8a10: 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31 31 3a  case _opt_tls11:
8a20: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e  ..    GET_OPT_IN
8a30: 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c  T(objv[idx], &tl
8a40: 73 31 5f 31 29 3b 0a 09 20 20 20 20 62 72 65 61  s1_1);..    brea
8a50: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c  k;..case _opt_tl
8a60: 73 31 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  s12:..    GET_OP
8a70: 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c  T_INT(objv[idx],
8a80: 20 26 74 6c 73 31 5f 32 29 3b 0a 09 20 20 20 20   &tls1_2);..    
8a90: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8aa0: 74 5f 74 6c 73 31 33 3a 0a 09 20 20 20 20 47 45  t_tls13:..    GE
8ab0: 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69  T_OPT_INT(objv[i
8ac0: 64 78 5d 2c 20 26 74 6c 73 31 5f 33 29 3b 0a 09  dx], &tls1_3);..
8ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
8ae0: 20 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65 3a 0a   _opt_validate:.
8af0: 09 63 61 73 65 20 5f 6f 70 74 5f 76 63 6d 64 3a  .case _opt_vcmd:
8b00: 0a 09 20 20 20 20 76 63 6d 64 20 3d 20 6f 62 6a  ..    vcmd = obj
8b10: 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65  v[idx];..    bre
8b20: 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ak;..}.    }..  
8b30: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09    if (request)..
8b40: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
8b50: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
8b60: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45   | SSL_VERIFY_PE
8b70: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  ER;.    if (requ
8b80: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09  est && require).
8b90: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
8ba0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
8bb0: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69  PEER_CERT;.    i
8bc0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
8bd0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65  st_handshake).ve
8be0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
8bf0: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
8c00: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66  E;.    if (verif
8c10: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20  y == 0)..verify 
8c20: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
8c30: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
8c40: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
8c50: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
8c60: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
8c70: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
8c80: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
8c90: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
8ca0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
8cb0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
8cc0: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
8cd0: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
8ce0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
8cf0: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
8d00: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20  _TLS1_2 : 0);.  
8d10: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
8d20: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _3 ? TLS_PROTO_T
8d30: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20  LS1_3 : 0);..   
8d40: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   /* reset to NUL
8d50: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e  L if blank strin
8d60: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20  g provided */.  
8d70: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a    if (cert && !*
8d80: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63  cert)..        c
8d90: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ert.        = NU
8da0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  LL;.    if (key 
8db0: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20  && !*key)..     
8dc0: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d     key.        =
8dd0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
8de0: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72  ertfile && !*cer
8df0: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63  tfile)         c
8e00: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  ertfile.= NULL;.
8e10: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
8e20: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b  && !*keyfile)..k
8e30: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
8e40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
8e50: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68  iphers && !*ciph
8e60: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70  ers).        cip
8e70: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
8e80: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
8e90: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63  hersuites && !*c
8ea0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70  iphersuites) cip
8eb0: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e  hersuites    = N
8ec0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66  ULL;.    if (CAf
8ed0: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29  ile && !*CAfile)
8ee0: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09  .        CAfile.
8ef0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
8f00: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26      if (CAdir &&
8f10: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20   !*CAdir).      
8f20: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20    CAdir.        
8f30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
8f40: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48  DHparams && !*DH
8f50: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20  params).        
8f60: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20  DHparams        
8f70: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
8f80: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f  new SSL state */
8f90: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d  .    statePtr..=
8fa0: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c   (State *) ckall
8fb0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
8fc0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
8fd0: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74    memset(statePt
8fe0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
8ff0: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  te));..    state
9000: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61  Ptr->flags.= fla
9010: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  gs;.    statePtr
9020: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72  ->interp.= inter
9030: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  p;.    statePtr-
9040: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79  >vflags.= verify
9050: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
9060: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f  err.= "";..    /
9070: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70  * allocate scrip
9080: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6d 64  t */.    if (cmd
9090: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj != NULL) {..
90a0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
90b0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f  ringFromObj(cmdO
90c0: 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  bj, &len);..if (
90d0: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
90e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
90f0: 20 63 6d 64 4f 62 6a 3b 0a 09 20 20 20 20 54 63   cmdObj;..    Tc
9100: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
9110: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
9120: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
9130: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
9140: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
9150: 20 28 70 61 73 73 77 64 4f 62 6a 20 21 3d 20 4e   (passwdObj != N
9160: 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ULL) {..(void) T
9170: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9180: 4f 62 6a 28 70 61 73 73 77 64 4f 62 6a 2c 20 26  Obj(passwdObj, &
9190: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
91a0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
91b0: 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73  >password = pass
91c0: 77 64 4f 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f  wdObj;..    Tcl_
91d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
91e0: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
91f0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
9200: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69  /* allocate vali
9210: 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  date command */.
9220: 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a      if (vcmd) {.
9230: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
9240: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d  tringFromObj(vcm
9250: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c  d, &len);..if (l
9260: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65  en) {..    state
9270: 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64  Ptr->vcmd = vcmd
9280: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
9290: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
92a0: 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20  ->vcmd);..}.    
92b0: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c  }..    if (model
92c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74   != NULL) {..int
92d0: 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74   mode;../* Get t
92e0: 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65  he "model" conte
92f0: 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  xt */..chan = Tc
9300: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
9310: 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64  erp, model, &mod
9320: 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d  e);..if (chan ==
9330: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
9340: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
9350: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
9360: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
9370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9380: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65  .}.../*.. * Make
9390: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
93a0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
93b0: 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68  channel.. */..ch
93c0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
93d0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69  hannel(chan);..i
93e0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
93f0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
9400: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
9410: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
9420: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9430: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
9440: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
9450: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
9460: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
9470: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
9480: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
9490: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
94a0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
94b0: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
94c0: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
94d0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
94e0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
94f0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
9500: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
9510: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
9520: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
9530: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
9540: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
9550: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
9560: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
9570: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
9580: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
9590: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
95a0: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e  t, (int) key_len
95b0: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72  ,..    (int) cer
95c0: 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41  t_len, CAdir, CA
95d0: 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63  file, ciphers, c
95e0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76  iphersuites, lev
95f0: 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d  el, DHparams)) =
9600: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54  = NULL) {..    T
9610: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
9620: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
9630: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9640: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
9650: 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d   statePtr->ctx =
9660: 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20   ctx;..    /*.  
9670: 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20     * We need to 
9680: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
9690: 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73  he channel works
96a0: 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20   in binary (for 
96b0: 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79  the.     * encry
96c0: 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74  ption not to get
96d0: 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20   goofed up)..   
96e0: 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74    * We only want
96f0: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62   to adjust the b
9700: 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d  uffering in pre-
9710: 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65  v2 channels, whe
9720: 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63  re.     * each c
9730: 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74  hannel in the st
9740: 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69  ack maintained i
9750: 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a  ts own buffers..
9760: 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f       */.    Tcl_
9770: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
9780: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
9790: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
97a0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
97b0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
97c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
97d0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
97e0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
97f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
9800: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  t(&upperChannelE
9810: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
9820: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
9830: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
9840: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70   "-eofchar", &up
9850: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
9860: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  r);.    Tcl_GetC
9870: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9880: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63  erp, chan, "-enc
9890: 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68  oding", &upperCh
98a0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
98b0: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
98c0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
98d0: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
98e0: 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61  tion", &upperCha
98f0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
9900: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
9910: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9920: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
9930: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
9940: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20  nelBlocking);.  
9950: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
9960: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9970: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
9980: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a  on", "binary");.
9990: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
99a0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
99b0: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
99c0: 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20  g", "true");.   
99d0: 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d   dprintf("Consum
99e0: 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20  ing Tcl channel 
99f0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
9a00: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a  nelName(chan));.
9a10: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65      statePtr->se
9a20: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68  lf = Tcl_StackCh
9a30: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c  annel(interp, Tl
9a40: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c  s_ChannelType(),
9a50: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74   (ClientData) st
9a60: 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45 41  atePtr, (TCL_REA
9a70: 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54  DABLE | TCL_WRIT
9a80: 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20  ABLE), chan);.  
9a90: 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74    dprintf("Creat
9aa0: 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64  ed channel named
9ab0: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
9ac0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
9ad0: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69  r->self));.    i
9ae0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  f (statePtr->sel
9af0: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
9b00: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  l) NULL) {../*..
9b10: 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c   * No use of Tcl
9b20: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  _EventuallyFree 
9b30: 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69  because no possi
9b40: 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65  ble Tcl_Preserve
9b50: 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65  ... */..Tls_Free
9b60: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
9b70: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
9b80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9b90: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
9ba0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9bb0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
9bc0: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
9bd0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
9be0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
9bf0: 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20  anslation));.   
9c00: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
9c10: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
9c20: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
9c30: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44  encoding", Tcl_D
9c40: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
9c50: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
9c60: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  g));.    Tcl_Set
9c70: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9c80: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9c90: 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22  self, "-eofchar"
9ca0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
9cb0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
9cc0: 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54  EOFChar));.    T
9cd0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
9ce0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
9cf0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c  ePtr->self, "-bl
9d00: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  ocking", Tcl_DSt
9d10: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
9d20: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
9d30: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
9d40: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61  * SSL Initializa
9d50: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  tion.     */.   
9d60: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d   statePtr->ssl =
9d70: 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74   SSL_new(statePt
9d80: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20  r->ctx);.    if 
9d90: 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  (!statePtr->ssl)
9da0: 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61   {../* SSL libra
9db0: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c  ry error */..Tcl
9dc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9dd0: 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20  terp, "couldn't 
9de0: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65  construct ssl se
9df0: 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f 4e  ssion: ", REASON
9e00: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
9e10: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
9e20: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
9e30: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
9e40: 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c  ", "INIT", "FAIL
9e50: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
9e60: 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28  LL);..Tls_Free((
9e70: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
9e80: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
9e90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
9ea0: 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72   /* Set host ser
9eb0: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ver name */.    
9ec0: 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20  if (servername) 
9ed0: 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73  {../* Sets the s
9ee0: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63  erver name indic
9ef0: 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43  ation (SNI) in C
9f00: 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e  lientHello exten
9f10: 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20  sion */../* Per 
9f20: 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61  RFC 6066, hostna
9f30: 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e  me is a ASCII en
9f40: 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68  coded string, th
9f50: 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61  ough RFC 4366 sa
9f60: 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66  ys UTF-8. */..if
9f70: 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78   (!SSL_set_tlsex
9f80: 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74  t_host_name(stat
9f90: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
9fa0: 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72  rname) && requir
9fb0: 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  e) {..    Tcl_Ap
9fc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9fd0: 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53 20  p, "setting TLS 
9fe0: 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e 73  host name extens
9ff0: 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63 68  ion failed", (ch
a000: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a010: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
a020: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
a030: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
a040: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
a050: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a060: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
a070: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a080: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a090: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  RROR;..}.../* Se
a0a0: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70  t hostname for p
a0b0: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  eer certificate 
a0c0: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63  hostname verific
a0d0: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73  ation in clients
a0e0: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20  ...   Don't use 
a0f0: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69  SSL_set1_host si
a100: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74  nce it has limit
a110: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28  ations. */..if (
a120: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73  !SSL_add1_host(s
a130: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
a140: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20  rvername)) {..  
a150: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a160: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74  lt(interp, "sett
a170: 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61 6d  ing DNS host nam
a180: 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72  e failed", (char
a190: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a1a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
a1b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
a1c0: 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e  "IMPORT", "HOSTN
a1d0: 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  AME", "FAILED", 
a1e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
a1f0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a200: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a210: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a220: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
a230: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65  }..    /* Resume
a240: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20   session id */. 
a250: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69     if (session_i
a260: 64 20 26 26 20 73 65 73 73 5f 6c 65 6e 20 3c 3d  d && sess_len <=
a270: 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58   SSL_MAX_SID_CTX
a280: 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53  _LENGTH) {../* S
a290: 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29  SL_set_session()
a2a0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45   */..if (!SSL_SE
a2b0: 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f  SSION_set1_id_co
a2c0: 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65  ntext(SSL_get_se
a2d0: 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  ssion(statePtr->
a2e0: 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ssl), session_id
a2f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
a300: 20 73 65 73 73 5f 6c 65 6e 29 29 20 7b 0a 09 20   sess_len)) {.. 
a310: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a320: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73  ult(interp, "Res
a330: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22  ume session id "
a340: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20  , session_id, " 
a350: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a  failed", (char *
a360: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
a370: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
a380: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
a390: 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e  MPORT", "SESSION
a3a0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
a3b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a3c0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
a3d0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a3e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a3f0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
a400: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70      /* Enable Ap
a410: 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20  plication-Layer 
a420: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
a430: 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61  tion. Examples a
a440: 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68  re: http/1.0,..h
a450: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c  ttp/1.1, h2, h3,
a460: 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33   ftp, imap, pop3
a470: 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78  , xmpp-client, x
a480: 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74  mpp-server, mqtt
a490: 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20  , irc, etc. */. 
a4a0: 20 20 20 69 66 20 28 61 6c 70 6e 4f 62 6a 20 21     if (alpnObj !
a4b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 43 6f  = NULL) {../* Co
a4c0: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74  nvert a TCL list
a4d0: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c   into a protocol
a4e0: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f  -list in wire-fo
a4f0: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65  rmat */..unsigne
a500: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20  d char *protos, 
a510: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  *p;..unsigned in
a520: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30  t protos_len = 0
a530: 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c  ;..Tcl_Size cnt,
a540: 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c   i;..int j;..Tcl
a550: 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69  _Obj **list;...i
a560: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
a570: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
a580: 2c 20 61 6c 70 6e 4f 62 6a 2c 20 26 63 6e 74 2c  , alpnObj, &cnt,
a590: 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f   &list) != TCL_O
a5a0: 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  K) {..    Tls_Fr
a5b0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
a5c0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a5d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a5e0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
a5f0: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  the memory requi
a600: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74  red for the prot
a610: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f  ocol-list */..fo
a620: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e  r (i = 0; i < cn
a630: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54  t; i++) {..    T
a640: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a650: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65  Obj(list[i], &le
a660: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  n);..    if (len
a670: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f   > 255) {...Tcl_
a680: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a690: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f  erp, "ALPN proto
a6a0: 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e  col name too lon
a6b0: 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  g", (char *) NUL
a6c0: 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72  L);...Tcl_SetErr
a6d0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a6e0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a6f0: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22  "ALPN", "FAILED"
a700: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a710: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68  ;...Tls_Free((ch
a720: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a730: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
a740: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
a750: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31   protos_len += 1
a760: 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d   + (int) len;..}
a770: 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20  .../* Build the 
a780: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f  complete protoco
a790: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f  l-list */..proto
a7a0: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74  s = ckalloc(prot
a7b0: 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f  os_len);../* pro
a7c0: 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73  tocol-lists cons
a7d0: 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e  ist of 8-bit len
a7e0: 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79  gth-prefixed, by
a7f0: 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66  te strings */..f
a800: 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70  or (j = 0, p = p
a810: 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20  rotos; j < cnt; 
a820: 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  j++) {..    char
a830: 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53   *str = Tcl_GetS
a840: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73  tringFromObj(lis
a850: 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  t[j], &len);..  
a860: 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e    *p++ = (unsign
a870: 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20  ed char) len;.. 
a880: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72     memcpy(p, str
a890: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
a8a0: 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a  ..    p += len;.
a8b0: 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  .}.../* SSL_set_
a8c0: 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65  alpn_protos make
a8d0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
a8e0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
a8f0: 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20  ../* Note: This 
a900: 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73  functions revers
a910: 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  es the return va
a920: 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a  lue convention *
a930: 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61  /..if (SSL_set_a
a940: 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65  lpn_protos(state
a950: 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73  Ptr->ssl, protos
a960: 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b  , protos_len)) {
a970: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
a980: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a990: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c  failed to set AL
a9a0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28  PN protocols", (
a9b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
a9c0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
a9d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
a9e0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41  S", "IMPORT", "A
a9f0: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  LPN", "FAILED", 
aa00: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
aa10: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
aa20: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
aa30: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72  ;..    ckfree(pr
aa40: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75  otos);..    retu
aa50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
aa60: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74  .../* Store prot
aa70: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73  ocols list */..s
aa80: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
aa90: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65  = protos;..state
aaa0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
aab0: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  = protos_len;.  
aac0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
aad0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
aae0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ULL;..statePtr->
aaf0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
ab00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
ab10: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
ab20: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  ks.     */.    S
ab30: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_set_app_data(
ab40: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
ab50: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
ab60: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20  ;./* point back 
ab70: 74 6f 20 75 73 20 2a 2f 0a 0a 20 20 20 20 53 53  to us */..    SS
ab80: 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61  L_set_verify(sta
ab90: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69  tePtr->ssl, veri
aba0: 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61  fy, VerifyCallba
abb0: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74  ck);.    SSL_set
abc0: 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73  _info_callback(s
abd0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e  tatePtr->ssl, In
abe0: 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20  foCallback);..  
abf0: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f    /* Callback fo
ac00: 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74  r observing prot
ac10: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f  ocol messages */
ac20: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
ac30: 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20  _NO_SSL_TRACE.  
ac40: 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54    /* void SSL_CT
ac50: 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  X_set_msg_callba
ac60: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
ac70: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ctx, (void *)st
ac80: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69  atePtr);.    voi
ac90: 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73  d SSL_CTX_set_ms
aca0: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  g_callback(state
acb0: 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67  Ptr->ctx, Messag
acc0: 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20  eCallback); */. 
acd0: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63     SSL_set_msg_c
ace0: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74  allback_arg(stat
acf0: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
ad00: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20   *)statePtr);.  
ad10: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
ad20: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
ad30: 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c  >ssl, MessageCal
ad40: 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a  lback);.#endif..
ad50: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63      /* Create Tc
ad60: 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61  l_Channel BIO Ha
ad70: 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61  ndler */.    sta
ad80: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42  tePtr->p_bio.= B
ad90: 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65  IO_new_tcl(state
ada0: 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45  Ptr, BIO_NOCLOSE
adb0: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
adc0: 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42  >bio.= BIO_new(B
add0: 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20  IO_f_ssl());..  
ade0: 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a    if (server) {.
adf0: 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62  ./* Server callb
ae00: 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  acks */..SSL_CTX
ae10: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
ae20: 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65  ername_arg(state
ae30: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
ae40: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53  *)statePtr);..SS
ae50: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74  L_CTX_set_tlsext
ae60: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c  _servername_call
ae70: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
ae80: 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29  tx, SNICallback)
ae90: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ;..SSL_CTX_set_c
aea0: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73  lient_hello_cb(s
aeb0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65  tatePtr->ctx, He
aec0: 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  lloCallback, (vo
aed0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
aee0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70  .if (statePtr->p
aef0: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
af00: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
af10: 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62  t_alpn_select_cb
af20: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
af30: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
af40: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
af50: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
af60: 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20  .    if (tls1_2 
af70: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d  == 0 && tls1_3 =
af80: 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58  = 0) {...SSL_CTX
af90: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73  _set_next_protos
afa0: 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73  _advertised_cb(s
afb0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50  tatePtr->ctx, NP
afc0: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
afd0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20   *)statePtr);.. 
afe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a     }.#endif..}..
aff0: 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65  ./* Enable serve
b000: 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72  r to send cert r
b010: 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e  equest after han
b020: 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20  dshake (TLS 1.3 
b030: 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77  only) */../* A w
b040: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d  rite operation m
b050: 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66  ust take place f
b060: 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61  or the Certifica
b070: 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65  te Request to be
b080: 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65  ..   sent to the
b090: 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61   client, this ca
b0a0: 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53  n be done with S
b0b0: 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28  SL_do_handshake(
b0c0: 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  ). */..if (reque
b0d0: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
b0e0: 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20  hake && tls1_3) 
b0f0: 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66  {..    SSL_verif
b100: 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61  y_client_post_ha
b110: 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72  ndshake(statePtr
b120: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ->ssl);..}.../* 
b130: 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75  set automatic cu
b140: 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f  rve selection */
b150: 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61  ..SSL_set_ecdh_a
b160: 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uto(statePtr->ss
b170: 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20  l, 1);.../* Set 
b180: 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09  server mode */..
b190: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
b1a0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45  |= TLS_TCL_SERVE
b1b0: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65  R;..SSL_set_acce
b1c0: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  pt_state(statePt
b1d0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
b1e0: 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74  lse {../* Client
b1f0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69   callbacks */.#i
b200: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66  fdef USE_NPN..if
b210: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
b220: 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c  os != NULL && tl
b230: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73  s1_2 == 0 && tls
b240: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20  1_3 == 0) {..   
b250: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78   SSL_CTX_set_nex
b260: 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63  t_proto_select_c
b270: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
b280: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28   ALPNCallback, (
b290: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
b2a0: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  ;..}.#endif.../*
b2b0: 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67   Session caching
b2c0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
b2d0: 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
b2e0: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
b2f0: 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48  x, SSL_SESS_CACH
b300: 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53  E_CLIENT | SSL_S
b310: 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54  ESS_CACHE_NO_INT
b320: 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53  ERNAL_STORE);..S
b330: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
b340: 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d  new_cb(statePtr-
b350: 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c  >ctx, SessionCal
b360: 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61  lback);.../* Ena
b370: 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61  ble post handsha
b380: 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f  ke Authenticatio
b390: 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53  n extension. TLS
b3a0: 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68   1.3 only, not h
b3b0: 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72  ttp/2. */..if (r
b3c0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
b3d0: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20  andshake) {..   
b3e0: 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61   SSL_set_post_ha
b3f0: 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61  ndshake_auth(sta
b400: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a  tePtr->ssl, 1);.
b410: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65  .}.../* Set clie
b420: 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f  nt mode */..SSL_
b430: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74  set_connect_stat
b440: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
b450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  ;.    }.    SSL_
b460: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72  set_bio(statePtr
b470: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d  ->ssl, statePtr-
b480: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72  >p_bio, statePtr
b490: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49  ->p_bio);.    BI
b4a0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50  O_set_ssl(stateP
b4b0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74  tr->bio, statePt
b4c0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c  r->ssl, BIO_NOCL
b4d0: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  OSE);..    /*.  
b4e0: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20     * End of SSL 
b4f0: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20  Init.     */.   
b500: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
b510: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  ing %s", Tcl_Get
b520: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
b530: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
b540: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
b550: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
b560: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
b570: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
b580: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  lf), TCL_VOLATIL
b590: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  E);..    return 
b5a0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
b5b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
b5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70  ----. *. * Unimp
b600: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
b610: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
b620: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
b630: 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f  remove the topmo
b640: 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65  st channel filte
b650: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
b660: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
b670: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
b680: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
b690: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
b6a0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
b6b0: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
b6c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
b6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b700: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
b710: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a   int.UnimportObj
b720: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
b730: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
b740: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
b750: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
b760: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
b770: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
b780: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
b790: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
b7a0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
b7b0: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
b7c0: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
b7d0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
b7e0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
b7f0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
b800: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b810: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
b820: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b830: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
b840: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
b850: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
b860: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b870: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
b880: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
b890: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
b8a0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
b8b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
b8c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
b8d0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
b8e0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
b8f0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
b900: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
b910: 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54  han);..    if (T
b920: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
b930: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
b940: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
b950: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b960: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
b970: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
b980: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
b990: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
b9a0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
b9b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b9c0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b9d0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e  terp, "TLS", "UN
b9e0: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45  IMPORT", "CHANNE
b9f0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
ba00: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
ba10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ba20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
ba30: 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e  (Tcl_UnstackChan
ba40: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
ba50: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20  ) == TCL_ERROR) 
ba60: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
ba70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
ba80: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ba90: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
baa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
bae0: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f  * CTX_Init -- co
baf0: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54  nstruct a SSL_CT
bb00: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a  X instance. *. *
bb10: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76   Results:. *.A v
bb20: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73  alid SSL_CTX ins
bb30: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20  tance or NULL.. 
bb40: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
bb50: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
bb60: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
bb70: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
bb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
bbc0: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
bbd0: 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  .CTX_Init(State 
bbe0: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
bbf0: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
bc00: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c  to, char *keyfil
bc10: 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c  e, char *certfil
bc20: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
bc30: 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67  char *key, unsig
bc40: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20  ned char *cert, 
bc50: 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74  int key_len, int
bc60: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20   cert_len, char 
bc70: 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72  *CAdir,.    char
bc80: 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a   *CAfile, char *
bc90: 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63  ciphers, char *c
bca0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74  iphersuites, int
bcb0: 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48   level, char *DH
bcc0: 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63  params) {.    Tc
bcd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
bce0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74   = statePtr->int
bcf0: 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  erp;.    SSL_CTX
bd00: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
bd10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
bd20: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
bd30: 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f  g ds1;.    int o
bd40: 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ff = 0;.    int 
bd50: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
bd60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
bd70: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a  METHOD *method;.
bd80: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
bd90: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
bda0: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f  (!proto) {..Tcl_
bdb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bdc0: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70  erp, "no valid p
bdd0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
bde0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
bdf0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
be00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63  .    }..    /* c
be10: 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78  reate SSL contex
be20: 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  t */.#if OPENSSL
be30: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
be40: 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c  >= 0x10100000L |
be50: 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  | defined(NO_SSL
be60: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
be70: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
be80: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
be90: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
bea0: 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  SSL2)) {..Tcl_Ap
beb0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
bec0: 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f  p, "SSL2 protoco
bed0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
bee0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bef0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
bf00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
bf10: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
bf20: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
bf30: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
bf40: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
bf50: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
bf60: 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL3)) {..Tcl_App
bf70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bf80: 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c  , "SSL3 protocol
bf90: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
bfa0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
bfb0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
bfc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
bfd0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
bfe0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
bff0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
c000: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
c010: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
c020: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  S1)) {..Tcl_Appe
c030: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c040: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63   "TLS 1.0 protoc
c050: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
c060: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
c070: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
c080: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
c090: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
c0a0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
c0b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
c0c0: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
c0d0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
c0e0: 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09  OTO_TLS1_1)) {..
c0f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c100: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
c110: 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  1 protocol not s
c120: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
c130: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
c140: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
c150: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
c160: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
c170: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c180: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69  NO_TLS1_2).    i
c190: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
c1a0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
c1b0: 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _2)) {..Tcl_Appe
c1c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c1d0: 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63   "TLS 1.2 protoc
c1e0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
c1f0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
c200: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
c210: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
c220: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
c230: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
c240: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
c250: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
c260: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
c270: 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09  OTO_TLS1_3)) {..
c280: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c290: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
c2a0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
c2b0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
c2c0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
c2d0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
c2e0: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72  endif.    if (pr
c2f0: 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20  oto == 0) {../* 
c300: 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a  Use full range *
c310: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  /..SSL_CTX_set_m
c320: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
c330: 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43  (ctx, 0);..SSL_C
c340: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
c350: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29  _version(ctx, 0)
c360: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
c370: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69  tch (proto) {.#i
c380: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
c390: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
c3a0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
c3b0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
c3c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c3d0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
c3e0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
c3f0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
c400: 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72  rver ? SSLv2_ser
c410: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
c420: 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv2_client_meth
c430: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
c440: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
c450: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
c460: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c470: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
c480: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
c490: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
c4a0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
c4b0: 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  SL3:..method = i
c4c0: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f  sServer ? SSLv3_
c4d0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
c4e0: 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d  : SSLv3_client_m
c4f0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
c500: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
c510: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
c520: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c530: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  L_NO_TLS1) && !d
c540: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c550: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20  O_TLS1_METHOD). 
c560: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
c570: 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20  O_TLS1:..method 
c580: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
c590: 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v1_server_method
c5a0: 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e  () : TLSv1_clien
c5b0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
c5c0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
c5d0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
c5e0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
c5f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
c600: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c610: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
c620: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
c630: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
c640: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  1:..method = isS
c650: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f  erver ? TLSv1_1_
c660: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
c670: 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74  : TLSv1_1_client
c680: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
c690: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
c6a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
c6b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c6c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
c6d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c6e0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
c6f0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
c700: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
c710: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
c720: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73  rver ? TLSv1_2_s
c730: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
c740: 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f   TLSv1_2_client_
c750: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
c760: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
c770: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
c780: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c790: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
c7a0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
c7b0: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55  TO_TLS1_3:../* U
c7c0: 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d  se the generic m
c7d0: 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72  ethod and constr
c7e0: 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72  aint range after
c7f0: 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61   context is crea
c800: 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d  ted */..method =
c810: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f   isServer ? TLS_
c820: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
c830: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74  : TLS_client_met
c840: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
c850: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
c860: 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65  t:../* Negotiate
c870: 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62   highest availab
c880: 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69  le SSL/TLS versi
c890: 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  on */..method = 
c8a0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
c8b0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
c8c0: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
c8d0: 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  od();.#if OPENSS
c8e0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
c8f0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
c900: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
c910: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
c920: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
c930: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
c940: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
c950: 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a  TO_SSL2)   ? 0 :
c960: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32   SSL_OP_NO_SSLv2
c970: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
c980: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
c990: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c9a0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66  SSL_NO_SSL3)..of
c9b0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
c9c0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
c9d0: 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  SL3)   ? 0 : SSL
c9e0: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23  _OP_NO_SSLv3);.#
c9f0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
ca00: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
ca10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
ca20: 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d  NO_TLS1)..off |=
ca30: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
ca40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
ca50: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
ca60: 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69  NO_TLSv1);.#endi
ca70: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
ca80: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
ca90: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
caa0: 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d  _TLS1_1)..off |=
cab0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
cac0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
cad0: 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  1) ? 0 : SSL_OP_
cae0: 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e  NO_TLSv1_1);.#en
caf0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
cb00: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
cb10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
cb20: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20  NO_TLS1_2)..off 
cb30: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
cb40: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
cb50: 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_2) ? 0 : SSL_O
cb60: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23  P_NO_TLSv1_2);.#
cb70: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
cb80: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
cb90: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
cba0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66  L_NO_TLS1_3)..of
cbb0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
cbc0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
cbd0: 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_3) ? 0 : SSL
cbe0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b  _OP_NO_TLSv1_3);
cbf0: 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a  .#endif..break;.
cc00: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
cc10: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
cc20: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
cc30: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
cc40: 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72    if (!ctx) {..r
cc50: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20  eturn(NULL);.   
cc60: 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65   }..    if (gete
cc70: 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45  nv(SSLKEYLOGFILE
cc80: 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  )) {..SSL_CTX_se
cc90: 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63  t_keylog_callbac
cca0: 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c  k(ctx, KeyLogCal
ccb0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23  lback);.    }..#
ccc0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
ccd0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
cce0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
ccf0: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72  S1_3).    if (pr
cd00: 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f  oto == TLS_PROTO
cd10: 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f  _TLS1_3) {..SSL_
cd20: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
cd30: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
cd40: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
cd50: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
cd60: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
cd70: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
cd80: 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ON);.    }.#endi
cd90: 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20  f..    /* Force 
cda0: 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e  cipher selection
cdb0: 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72   order by server
cdc0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53   */.    if (!isS
cdd0: 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54  erver) {..SSL_CT
cde0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
cdf0: 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52  x, SSL_OP_CIPHER
ce00: 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e  _SERVER_PREFEREN
ce10: 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  CE);.    }..#if 
ce20: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
ce30: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
ce40: 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c  000L.    OpenSSL
ce50: 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74  _add_all_algorit
ce60: 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63  hms(); /* Load c
ce70: 69 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 73  iphers and diges
ce80: 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ts */.#endif..  
ce90: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70    SSL_CTX_set_ap
cea0: 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  p_data(ctx, (voi
ceb0: 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72  d*)interp);./* r
cec0: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65  emember the inte
ced0: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53  rpreter */.    S
cee0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
cef0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41  ns(ctx, SSL_OP_A
cf00: 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20  LL);./* all SSL 
cf10: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20  bug workarounds 
cf20: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
cf30: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
cf40: 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45  SSL_OP_NO_COMPRE
cf50: 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62  SSION);./* disab
cf60: 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65  le compression e
cf70: 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64  ven if supported
cf80: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
cf90: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
cfa0: 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62   off);../* disab
cfb0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  le protocol vers
cfc0: 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  ions */.#if OPEN
cfd0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
cfe0: 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c  ER < 0x10101000L
cff0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
d000: 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d  _mode(ctx, SSL_M
d010: 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b  ODE_AUTO_RETRY);
d020: 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68  ./* handle new h
d030: 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63  andshakes in bac
d040: 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64  kground. On by d
d050: 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53  efault in OpenSS
d060: 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64  L 1.1.1. */.#end
d070: 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  if.    SSL_CTX_s
d080: 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69  ess_set_cache_si
d090: 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20  ze(ctx, 128);.. 
d0a0: 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64     /* Set user d
d0b0: 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20  efined ciphers, 
d0c0: 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61  cipher suites, a
d0d0: 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65  nd security leve
d0e0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69  l */.    if ((ci
d0f0: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26  phers != NULL) &
d100: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  & !SSL_CTX_set_c
d110: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20  ipher_list(ctx, 
d120: 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c  ciphers)) {..Tcl
d130: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d140: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65  terp, "Set ciphe
d150: 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  rs failed: No va
d160: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
d170: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
d180: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
d190: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d1a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63      }.    if ((c
d1b0: 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e  iphersuites != N
d1c0: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58  ULL) && !SSL_CTX
d1d0: 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 65  _set_ciphersuite
d1e0: 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 69  s(ctx, ciphersui
d1f0: 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  tes)) {..Tcl_App
d200: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d210: 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73 75  , "Set cipher su
d220: 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20  ites failed: No 
d230: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20  valid ciphers", 
d240: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d250: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
d260: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
d270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d280: 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76  Set security lev
d290: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65  el */.    if (le
d2a0: 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65  vel > -1 && leve
d2b0: 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c  l < 6) {../* SSL
d2c0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _set_security_le
d2d0: 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  vel */..SSL_CTX_
d2e0: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  set_security_lev
d2f0: 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a  el(ctx, level);.
d300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
d310: 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73  t some callbacks
d320: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
d330: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
d340: 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77  wd_cb(ctx, Passw
d350: 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ordCallback);.  
d360: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65    SSL_CTX_set_de
d370: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f  fault_passwd_cb_
d380: 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76  userdata(ctx, (v
d390: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
d3a0: 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20  ..    /* read a 
d3b0: 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70  Diffie-Hellman p
d3c0: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20  arameters file, 
d3d0: 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74  or use the built
d3e0: 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65  -in one */.#ifde
d3f0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a  f OPENSSL_NO_DH.
d400: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
d410: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
d420: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d430: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65  terp, "DH parame
d440: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20  ter support not 
d450: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61  available", (cha
d460: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
d470: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
d480: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d490: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a    }.#else.    {.
d4a0: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48  .DH* dh;..if (DH
d4b0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
d4c0: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  {..    BIO *bio;
d4d0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
d4e0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20  gInit(&ds);..   
d4f0: 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66   bio = BIO_new_f
d500: 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73  ile(F2N(DHparams
d510: 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20  , &ds), "r");.. 
d520: 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09     if (!bio) {..
d530: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
d540: 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70  (&ds);...Tcl_App
d550: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d560: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  , "Could not fin
d570: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  d DH parameters 
d580: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
d590: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
d5a0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
d5b0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
d5c0: 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d  }...    dh = PEM
d5d0: 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61  _read_bio_DHpara
d5e0: 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55  ms(bio, NULL, NU
d5f0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  LL, NULL);..    
d600: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09  BIO_free(bio);..
d610: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
d620: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69  ree(&ds);..    i
d630: 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f  f (!dh) {...Tcl_
d640: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d650: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
d660: 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65  read DH paramete
d670: 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28  rs from file", (
d680: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d690: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
d6a0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
d6b0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53  L;..    }..    S
d6c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64  SL_CTX_set_tmp_d
d6d0: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20  h(ctx, dh);..   
d6e0: 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09   DH_free(dh);...
d6f0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a  } else {..    /*
d700: 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20   Use well known 
d710: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  DH parameters th
d720: 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e  at have built-in
d730: 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e   support in Open
d740: 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28  SSL */..    if (
d750: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f  !SSL_CTX_set_dh_
d760: 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a  auto(ctx, 1)) {.
d770: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d780: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
d790: 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74  d not enable set
d7a0: 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 52 45 41   DH auto: ", REA
d7b0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
d7c0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
d7d0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
d7e0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
d7f0: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  }..}.    }.#endi
d800: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
d810: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
d820: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
d830: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
d840: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
d850: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
d860: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
d870: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
d880: 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  &ds);...if (SSL_
d890: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
d8a0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  ate_file(ctx, F2
d8b0: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29  N(certfile, &ds)
d8c0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
d8d0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  EM) <= 0) {..   
d8e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
d8f0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
d900: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d910: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
d920: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  set certificate 
d930: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
d940: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  , ": ",....     
d950: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
d960: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
d970: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
d980: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
d990: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
d9a0: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
d9b0: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
d9c0: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
d9d0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
d9e0: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
d9f0: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
da00: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
da10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
da20: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
da30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
da40: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
da50: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
da60: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
da70: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
da80: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
da90: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
daa0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
dab0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
dac0: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61  .certfile = (cha
dad0: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61  r*)X509_get_defa
dae0: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b  ult_cert_file();
daf0: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
db00: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
db10: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c  ile(ctx, certfil
db20: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  e, SSL_FILETYPE_
db30: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66  PEM) <= 0) {.#if
db40: 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   0..    Tcl_DStr
db50: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
db60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
db70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
db80: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75  ble to use defau
db90: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  lt certificate f
dba0: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
dbb0: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
dbc0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
dbd0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
dbe0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
dbf0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
dc00: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20  L;.#endif..}.   
dc10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f   }..    /* set o
dc20: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a  ur private key *
dc30: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70  /.    if (load_p
dc40: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69  rivate_key) {..i
dc50: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
dc60: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c  LL && key == NUL
dc70: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c  L) {..    keyfil
dc80: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d  e = certfile;..}
dc90: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21  ...if (keyfile !
dca0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f  = NULL) {..    /
dcb0: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74  * get the privat
dcc0: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
dcd0: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69   with this certi
dce0: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69  ficate */..    i
dcf0: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
dd00: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20  LL) {...keyfile 
dd10: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20  = certfile;..   
dd20: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c   }...    if (SSL
dd30: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
dd40: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
dd50: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c  N(keyfile, &ds),
dd60: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
dd70: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  M) <= 0) {...Tcl
dd80: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
dd90: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
dda0: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
ddb0: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
ddc0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
ddd0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
dde0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
ddf0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
de00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
de10: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
de20: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
de30: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c  y file ", keyfil
de40: 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20  e, " ",....     
de50: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
de60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
de70: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
de80: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
de90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
dea0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
deb0: 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20  s);...} else if 
dec0: 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (key != NULL) {.
ded0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
dee0: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
def0: 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53  ASN1(EVP_PKEY_RS
df00: 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f  A, ctx, key,key_
df10: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54  len) <= 0) {...T
df20: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
df30: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  ds);.../* flush 
df40: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
df50: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
df60: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
df70: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
df80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
df90: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
dfa0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
dfb0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
dfc0: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
dfd0: 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  key: ", REASON()
dfe0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
dff0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
e000: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
e010: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
e020: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
e030: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
e040: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
e050: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
e060: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
e070: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
e080: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
e090: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
e0a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e0b0: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
e0c0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
e0d0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
e0e0: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
e0f0: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
e100: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
e110: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e120: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
e130: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
e140: 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74  /* Set verificat
e150: 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54  ion CAs */.    T
e160: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
e170: 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ds);.    Tcl_DSt
e180: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a  ringInit(&ds1);.
e190: 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
e1a0: 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  one default dire
e1b0: 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75  ctory, one defau
e1c0: 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65  lt file, and one
e1d0: 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a   default store..
e1e0: 09 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20  .The default CA 
e1f0: 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72  certificates dir
e200: 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61  ectory (and defa
e210: 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e  ult store) is in
e220: 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65   the OpenSSL..ce
e230: 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49  rts directory. I
e240: 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  t can be overrid
e250: 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43  den by the SSL_C
e260: 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e  ERT_DIR env var.
e270: 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41   The..default CA
e280: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69   certificates fi
e290: 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72  le is called cer
e2a0: 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66  t.pem in the def
e2b0: 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69  ault OpenSSL..di
e2c0: 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20  rectory. It can 
e2d0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
e2e0: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49   the SSL_CERT_FI
e2f0: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09  LE env var. */..
e300: 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73  /* int SSL_CTX_s
e310: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
e320: 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63  y_dir(SSL_CTX *c
e330: 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f  tx) and int SSL_
e340: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
e350: 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f  verify_file(SSL_
e360: 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20  CTX *ctx) */.   
e370: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
e380: 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69  ad_verify_locati
e390: 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ons(ctx, F2N(CAf
e3a0: 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43  ile, &ds), F2N(C
e3b0: 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a  Adir, &ds1)) ||.
e3c0: 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  .!SSL_CTX_set_de
e3d0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74  fault_verify_pat
e3e0: 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30  hs(ctx)) {.#if 0
e3f0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
e400: 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74  e(&ds);..Tcl_DSt
e410: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
e420: 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e  ./* Don't curren
e430: 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73  tly care if this
e440: 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41   fails */..Tcl_A
e450: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e460: 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74  rp, "SSL default
e470: 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22   verify paths: "
e480: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  , REASON(), (cha
e490: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
e4a0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e4b0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65  .return NULL;.#e
e4c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
e4d0: 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63  /* https://sourc
e4e0: 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73  eforge.net/p/tls
e4f0: 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20  /bugs/57/ */.   
e500: 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65   /* XXX:TODO: Le
e510: 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c  t the user suppl
e520: 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e  y values here in
e530: 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69  stead of somethi
e540: 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f  ng that exists o
e550: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
e560: 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69   */.    if (CAfi
e570: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53  le != NULL) {..S
e580: 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
e590: 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20  E) *certNames = 
e5a0: 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f  SSL_load_client_
e5b0: 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69  CA_file(F2N(CAfi
e5c0: 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28  le, &ds));..if (
e5d0: 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c  certNames != NUL
e5e0: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  L) {..    SSL_CT
e5f0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
e600: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
e610: 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  mes);..}.    }..
e620: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
e630: 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63  ree(&ds);.    Tc
e640: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e650: 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  s1);.    return 
e660: 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ctx;.}.../*. *--
e670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6b0: 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62  -. *. * StatusOb
e6c0: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
e6d0: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63  ertificate for c
e6e0: 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20  onnected peer.. 
e6f0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
e700: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
e710: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
e720: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
e730: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
e740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
e780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61  /.static int.Sta
e790: 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  tusObjCmd(Client
e7a0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
e7b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e7c0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
e7d0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
e7e0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74  jv[]) {.    Stat
e7f0: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20  e *statePtr;.   
e800: 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20   X509 *peer;.   
e810: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
e820: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
e830: 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72  l chan;.    char
e840: 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a   *channelName, *
e850: 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74  ciphers;.    int
e860: 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   mode;.    const
e870: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e880: 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67  proto;.    unsig
e890: 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20  ned int len;.   
e8a0: 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20   int nid, res;. 
e8b0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
e8c0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
e8d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
e8e0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20     if (objc < 2 
e8f0: 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28  || objc > 3 || (
e900: 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74  objc == 3 && !st
e910: 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
e920: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c  ng(objv[1]), "-l
e930: 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f  ocal"))) {..Tcl_
e940: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e950: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
e960: 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22  -local? channel"
e970: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
e980: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
e990: 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20   /* Get channel 
e9a0: 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65  Id */.    channe
e9b0: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  lName = Tcl_GetS
e9c0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
e9d0: 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31  v[(objc == 2 ? 1
e9e0: 20 3a 20 32 29 5d 2c 20 28 54 63 6c 5f 53 69 7a   : 2)], (Tcl_Siz
e9f0: 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  e *) NULL);.    
ea00: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
ea10: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
ea20: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65  annelName, &mode
ea30: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
ea40: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
ea50: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
ea60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ea70: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
ea80: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
ea90: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
eaa0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
eab0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
eac0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
ead0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
eae0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
eaf0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
eb00: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
eb10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
eb20: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
eb30: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
eb40: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
eb50: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
eb60: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
eb70: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
eb80: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
eb90: 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45  STATUS", "CHANNE
eba0: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
ebb0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
ebc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ebd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
ebe0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
ebf0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
ec00: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
ec10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63  );..    /* Get c
ec20: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70  ertificate for p
ec30: 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20  eer or self */. 
ec40: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
ec50: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  ) {..peer = SSL_
ec60: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69  get_peer_certifi
ec70: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
ec80: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
ec90: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
eca0: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  t_certificate(st
ecb0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
ecc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
ecd0: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
ece0: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20   info */.    if 
ecf0: 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72  (peer) {..objPtr
ed00: 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62   = Tls_NewX509Ob
ed10: 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b  j(interp, peer);
ed20: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29  ..if (objc == 2)
ed30: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65   {..    X509_fre
ed40: 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65  e(peer);..    pe
ed50: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  er = NULL;..}.  
ed60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50    } else {..objP
ed70: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
ed80: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
ed90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72    }..    /* Peer
eda0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50   name */.    LAP
edb0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
edc0: 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61   objPtr, "peerna
edd0: 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65  me", SSL_get0_pe
ede0: 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  ername(statePtr-
edf0: 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20  >ssl), -1);.    
ee00: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
ee10: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69  rp, objPtr, "sbi
ee20: 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70  ts", SSL_get_cip
ee30: 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74  her_bits(statePt
ee40: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a  r->ssl, NULL));.
ee50: 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28  .    ciphers = (
ee60: 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69  char*)SSL_get_ci
ee70: 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73  pher(statePtr->s
ee80: 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  sl);.    LAPPEND
ee90: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
eea0: 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63  Ptr, "cipher", c
eeb0: 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20  iphers, -1);..  
eec0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
eed0: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
eee0: 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68   presented by th
eef0: 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41  e peer */.    LA
ef00: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
ef10: 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
ef20: 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f  yResult",..X509_
ef30: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f  verify_cert_erro
ef40: 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74  r_string(SSL_get
ef50: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73  _verify_result(s
ef60: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20  tatePtr->ssl)), 
ef70: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  -1);..    /* Ver
ef80: 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ify mode */.    
ef90: 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76  mode = SSL_get_v
efa0: 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65  erify_mode(state
efb0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69  Ptr->ssl);.    i
efc0: 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
efd0: 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c  ERIFY_NONE) {..L
efe0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
eff0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
f000: 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c  fyMode", "none",
f010: 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65   -1);.    } else
f020: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73   {..Tcl_Obj *lis
f030: 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  tObjPtr = Tcl_Ne
f040: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
f050: 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  );..if (mode && 
f060: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29  SSL_VERIFY_PEER)
f070: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
f080: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f090: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
f0a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
f0b0: 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31  ngObj("peer", -1
f0c0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
f0d0: 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   && SSL_VERIFY_F
f0e0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
f0f0: 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ERT) {..    Tcl_
f100: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f110: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
f120: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
f130: 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20  StringObj("fail 
f140: 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22  if no peer cert"
f150: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
f160: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
f170: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20  FY_CLIENT_ONCE) 
f180: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
f190: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f1a0: 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
f1b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
f1c0: 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63  gObj("client onc
f1d0: 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  e", -1));..}..if
f1e0: 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
f1f0: 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48  RIFY_POST_HANDSH
f200: 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  AKE) {..    Tcl_
f210: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f220: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
f230: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
f240: 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20  StringObj("post 
f250: 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29  handshake", -1))
f260: 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42  ;..}..LAPPEND_OB
f270: 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  J(interp, objPtr
f280: 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  , "verifyMode", 
f290: 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20  listObjPtr).    
f2a0: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  }..    /* Verify
f2b0: 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20   mode depth */. 
f2c0: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
f2d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
f2e0: 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53  verifyDepth", SS
f2f0: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70  L_get_verify_dep
f300: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
f310: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f  ));..    /* Repo
f320: 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
f330: 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
f340: 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f  sult of the nego
f350: 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53  tiation */.    S
f360: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  SL_get0_alpn_sel
f370: 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e  ected(statePtr->
f380: 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ssl, &proto, &le
f390: 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  n);.    LAPPEND_
f3a0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
f3b0: 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61  tr, "alpn", (cha
f3c0: 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f  r *)proto, (Tcl_
f3d0: 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20  Size) len);.    
f3e0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
f3f0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f  rp, objPtr, "pro
f400: 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  tocol", SSL_get_
f410: 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72  version(statePtr
f420: 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20  ->ssl), -1);..  
f430: 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e    /* Valid for n
f440: 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65  on-RSA signature
f450: 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a   and TLS 1.3 */.
f460: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
f470: 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  2) {..res = SSL_
f480: 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75  get_peer_signatu
f490: 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  re_nid(statePtr-
f4a0: 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20  >ssl, &nid);.   
f4b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
f4c0: 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75   SSL_get_signatu
f4d0: 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  re_nid(statePtr-
f4e0: 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20  >ssl, &nid);.   
f4f0: 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29   }.    if (!res)
f500: 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20   {nid = 0;}.    
f510: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
f520: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67  rp, objPtr, "sig
f530: 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69  natureHashAlgori
f540: 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e  thm", OBJ_nid2ln
f550: 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  (nid), -1);..   
f560: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
f570: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
f580: 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
f590: 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
f5a0: 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
f5b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
f5c0: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
f5d0: 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
f5e0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
f5f0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
f600: 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
f610: 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
f620: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
f630: 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70  r, "signatureTyp
f640: 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  e", OBJ_nid2ln(n
f650: 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54  id), -1);..    T
f660: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f670: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
f680: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f690: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
f6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6e0: 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f  . *. * Connectio
f6f0: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72  nInfoObjCmd -- r
f700: 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  eturn connection
f710: 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53   info from OpenS
f720: 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
f730: 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20  s:. *.A list of 
f740: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a  connection info.
f750: 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    *. *----------
f760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
f7a0: 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63  tatic int Connec
f7b0: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43  tionInfoObjCmd(C
f7c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
f7d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
f7e0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
f7f0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
f800: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
f810: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
f820: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
f830: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
f840: 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65   on */.    State
f850: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
f860: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
f870: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
f880: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
f890: 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20  tr, *listPtr;.  
f8a0: 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c    const SSL *ssl
f8b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
f8c0: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a  CIPHER *cipher;.
f8d0: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45      const SSL_SE
f8e0: 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a  SSION *session;.
f8f0: 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44      const EVP_MD
f900: 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29   *md;.    (void)
f910: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
f920: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
f930: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
f940: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
f950: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
f960: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
f970: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
f980: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
f990: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
f9a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f9b0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63  Obj(objv[1], (Tc
f9c0: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c  l_Size *) NULL),
f9d0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
f9e0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
f9f0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
fa00: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
fa10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fa20: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
fa30: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
fa40: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
fa50: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
fa60: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
fa70: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
fa80: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
fa90: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
faa0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
fab0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fac0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
fad0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
fae0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
faf0: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
fb00: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
fb10: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
fb20: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
fb30: 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54   "TLS", "CONNECT
fb40: 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ION", "CHANNEL",
fb50: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
fb60: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
fb70: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
fb80: 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74      }..    objPt
fb90: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
fba0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
fbb0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
fbc0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74  info */.    stat
fbd0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
fbe0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
fbf0: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
fc00: 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74  ;.    ssl = stat
fc10: 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69  ePtr->ssl;.    i
fc20: 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
fc30: 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  {../* connection
fc40: 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45   state */..LAPPE
fc50: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
fc60: 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20  bjPtr, "state", 
fc70: 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
fc80: 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b  _long(ssl), -1);
fc90: 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65  .../* Get SNI re
fca0: 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e  quested server n
fcb0: 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ame */..LAPPEND_
fcc0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
fcd0: 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22  tr, "servername"
fce0: 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  , SSL_get_server
fcf0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
fd00: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
fd10: 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ame), -1);.../* 
fd20: 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  Get protocol */.
fd30: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
fd40: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
fd50: 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
fd60: 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d  _version(ssl), -
fd70: 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74  1);.../* Renegot
fd80: 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a  iation allowed *
fd90: 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
fda0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fdb0: 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61  "renegotiation_a
fdc0: 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74  llowed", SSL_get
fdd0: 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69  _secure_renegoti
fde0: 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73  ation_support(ss
fdf0: 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65  l));.../* Get se
fe00: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
fe10: 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
fe20: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
fe30: 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53  curity_level", S
fe40: 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
fe50: 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f  level(ssl));.../
fe60: 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
fe70: 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
fe80: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fe90: 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
fea0: 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65  , SSL_session_re
feb0: 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  used(ssl));.../*
fec0: 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20   Is server info 
fed0: 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
fee0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fef0: 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53   "is_server", SS
ff00: 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29  L_is_server(ssl)
ff10: 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20  );.../* Is DTLS 
ff20: 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
ff30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
ff40: 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f   "is_dtls", SSL_
ff50: 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20  is_dtls(ssl));. 
ff60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70     }..    /* Cip
ff70: 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  her info */.    
ff80: 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74  cipher = SSL_get
ff90: 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28  _current_cipher(
ffa0: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
ffb0: 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pher != NULL) {.
ffc0: 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a  .char buf[BUFSIZ
ffd0: 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69  ] = {0};..int bi
ffe0: 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09  ts, alg_bits;...
fff0: 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a  /* Cipher name *
10000 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
10010 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10020 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50  cipher", SSL_CIP
10030 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
10040 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
10050 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  RFC name of ciph
10060 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
10070 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10080 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d  r, "standard_nam
10090 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73  e", SSL_CIPHER_s
100a0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
100b0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
100c0 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20  OpenSSL name of 
100d0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
100e0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
100f0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f  bjPtr, "openssl_
10100 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63  name", OPENSSL_c
10110 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43  ipher_name(SSL_C
10120 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
10130 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31  ame(cipher)), -1
10140 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f  );.../* number o
10150 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73  f secret bits us
10160 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f  ed for cipher */
10170 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50  ..bits = SSL_CIP
10180 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70  HER_get_bits(cip
10190 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b  her, &alg_bits);
101a0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
101b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
101c0 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74  ecret_bits", bit
101d0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
101e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
101f0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73   "algorithm_bits
10200 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f  ", alg_bits);../
10210 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63  * alg_bits is ac
10220 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20  tual key secret 
10230 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74  bits. If use bit
10240 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c  s and secret (al
10250 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69  gorithm) bits di
10260 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65  ffer,..   the re
10270 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61  st of the bits a
10280 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66  re fixed, i.e. f
10290 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72  or limited expor
102a0 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20  t ciphers (bits 
102b0 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e  < 56) */.../* In
102c0 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53  dicates which SS
102d0 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76  L/TLS protocol v
102e0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66  ersion first def
102f0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20  ined the cipher 
10300 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
10310 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10320 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53  "min_version", S
10330 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
10340 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
10350 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  1);.../* Cipher 
10360 4e 49 44 2c 20 64 69 67 65 73 74 20 4e 49 44 20  NID, digest NID 
10370 28 6e 6f 6e 65 20 66 6f 72 20 41 45 41 44 20 63  (none for AEAD c
10380 69 70 68 65 72 20 73 75 69 74 65 73 29 2c 20 4b  ipher suites), K
10390 65 79 20 45 78 63 68 61 6e 67 65 20 4e 49 44 2c  ey Exchange NID,
103a0 20 61 6e 64 20 61 75 74 68 65 6e 74 69 63 61 74   and authenticat
103b0 69 6f 6e 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50  ion NID */..LAPP
103c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
103d0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e  objPtr, "cipherN
103e0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
103f0 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
10400 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69  ER_get_cipher_ni
10410 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
10420 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10430 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64  terp, objPtr, "d
10440 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72  igestNID", (char
10450 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
10460 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67  L_CIPHER_get_dig
10470 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29  est_nid(cipher))
10480 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
10490 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
104a0 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65  tr, "keyExchange
104b0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
104c0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
104d0 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63  HER_get_kx_nid(c
104e0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
104f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10500 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68  p, objPtr, "auth
10510 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20  enticationNID", 
10520 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
10530 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
10540 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65  t_auth_nid(ciphe
10550 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d  r)), -1);.../* m
10560 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63  essage authentic
10570 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70  ation code - Cip
10580 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67  her is AEAD (e.g
10590 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32  . GCM or ChaCha2
105a0 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e  0/Poly1305) or n
105b0 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e  ot */../* Authen
105c0 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69  ticated Encrypti
105d0 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74  on with associat
105e0 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63  ed data (AEAD) c
105f0 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  heck */..LAPPEND
10600 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
10610 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73  jPtr, "cipher_is
10620 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48  _aead", SSL_CIPH
10630 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65  ER_is_aead(ciphe
10640 72 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70  r));.../* Get Op
10650 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49  enSSL-specific I
10660 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a  D, not IANA ID *
10670 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  /..LAPPEND_INT(i
10680 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10690 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74  cipher_id", (int
106a0 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  ) SSL_CIPHER_get
106b0 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
106c0 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75  /* Two-byte ID u
106d0 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70  sed in the TLS p
106e0 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67  rotocol of the g
106f0 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09  iven cipher */..
10700 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10710 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f  rp, objPtr, "pro
10720 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29  tocol_id", (int)
10730 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
10740 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68  protocol_id(ciph
10750 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75  er));.../* Textu
10760 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  al description o
10770 66 20 74 68 65 20 63 69 70 68 65 72 2e 20 49 6e  f the cipher. In
10780 63 6c 75 64 65 73 3a 20 63 69 70 68 65 72 20 6e  cludes: cipher n
10790 61 6d 65 2c 20 70 72 6f 74 6f 63 6f 6c 20 76 65  ame, protocol ve
107a0 72 73 69 6f 6e 2c 20 6b 65 79 0a 09 20 20 20 65  rsion, key..   e
107b0 78 63 68 61 6e 67 65 2c 20 61 75 74 68 65 6e 74  xchange, authent
107c0 69 63 61 74 69 6f 6e 2c 20 73 79 6d 6d 65 74 72  ication, symmetr
107d0 69 63 20 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65  ic encryption me
107e0 74 68 6f 64 2c 20 6d 65 73 73 61 67 65 20 61 75  thod, message au
107f0 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64  thentication cod
10800 65 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49  e */..if (SSL_CI
10810 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
10820 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69  (cipher, buf, si
10830 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55  zeof(buf)) != NU
10840 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45  LL) {..    LAPPE
10850 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10860 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 74  bjPtr, "descript
10870 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a  ion", buf, -1);.
10880 09 7d 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75  .}.../* Digest u
10890 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 53  sed during the S
108a0 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65  SL/TLS handshake
108b0 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20   when using the 
108c0 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d  cipher. */..md =
108d0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
108e0 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74  handshake_digest
108f0 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45  (cipher);..LAPPE
10900 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10910 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b  bjPtr, "handshak
10920 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 72  e_digest", (char
10930 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d   *)EVP_MD_name(m
10940 64 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  d), -1);.    }..
10950 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
10960 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  nfo */.    sessi
10970 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73  on = SSL_get_ses
10980 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69  sion(ssl);.    i
10990 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55  f (session != NU
109a0 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
109b0 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
109c0 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32  et;..size_t len2
109d0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
109e0 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73  ulen;..const uns
109f0 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
10a00 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a  ion_id, *proto;.
10a10 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c  .char buffer[SSL
10a20 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
10a30 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
10a40 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
10a50 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
10a60 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
10a70 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
10a80 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
10a90 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
10aa0 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
10ab0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  o, &len2);..LAPP
10ac0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10ad0 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
10ae0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
10af0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
10b00 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
10b10 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
10b20 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
10b30 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
10b40 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
10b50 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
10b60 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
10b70 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
10b80 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
10b90 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10ba0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22  p, objPtr, "npn"
10bb0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
10bc0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
10bd0 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  n);.#endif.../* 
10be0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
10bf0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  n */..LAPPEND_BO
10c00 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
10c10 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  r, "resumable", 
10c20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72  SSL_SESSION_is_r
10c30 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e  esumable(session
10c40 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
10c50 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
10c60 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
10c70 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
10c80 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
10c90 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c  r, "start_time",
10ca0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
10cb0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b  _time(session));
10cc0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61  .../* Timeout va
10cd0 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65  lue - SSL_CTX_ge
10ce0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65  t_timeout (in se
10cf0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
10d00 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
10d10 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74  objPtr, "timeout
10d20 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
10d30 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
10d40 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
10d50 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
10d60 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
10d70 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
10d80 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
10d90 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
10da0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
10db0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
10dc0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22  tr, "session_id"
10dd0 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
10de0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
10df0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e  ../* Session con
10e00 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  text */..session
10e10 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
10e20 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
10e30 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  t(session, &ulen
10e40 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
10e50 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
10e60 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  r, "session_cont
10e70 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ext", session_id
10e80 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
10e90 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
10ea0 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
10eb0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
10ec0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
10ed0 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
10ee0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
10ef0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
10f00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
10f10 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69  sion_ticket", ti
10f20 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
10f30 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73   len2);.../* Ses
10f40 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
10f50 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
10f60 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
10f70 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
10f80 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d  objPtr, "lifetim
10f90 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
10fa0 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
10fb0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
10fc0 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
10fd0 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c  app data */..SSL
10fe0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
10ff0 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73  cket_appdata(ses
11000 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
11010 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
11020 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
11030 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61  bjPtr, "ticket_a
11040 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74  pp_data", ticket
11050 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
11060 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  2);.../* Get mas
11070 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
11080 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
11090 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
110a0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
110b0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
110c0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
110d0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
110e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
110f0 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
11100 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
11110 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73  );.../* Compress
11120 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67  ion id */..unsig
11130 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c  ned int id = SSL
11140 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d  _SESSION_get_com
11150 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e  press_id(session
11160 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11170 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11180 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22  "compression_id"
11190 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69  , id == 1 ? "zli
111a0 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  b" : "none", -1)
111b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
111c0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
111d0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
111e0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
111f0 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
11200 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
11210 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
11220 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
11230 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
11240 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
11250 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
11260 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
11270 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50  ion(ssl);...LAPP
11280 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11290 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
112a0 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53  sion", comp ? SS
112b0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
112c0 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  comp) : "none", 
112d0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
112e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
112f0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65  , "expansion", e
11300 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  xpn ? SSL_COMP_g
11310 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20  et_name(expn) : 
11320 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c  "none", -1);.#el
11330 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  se..LAPPEND_STR(
11340 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11350 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22  "compression", "
11360 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
11370 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11380 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
11390 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
113a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
113b0 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
113c0 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f  nfo */.    {..lo
113d0 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54  ng mode = SSL_CT
113e0 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_get_session_ca
113f0 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
11400 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a  r->ctx);..char *
11410 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20  msg;...if (mode 
11420 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
11430 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
11440 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
11450 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
11460 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
11470 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
11480 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
11490 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
114a0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
114b0 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
114c0 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
114d0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
114e0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
114f0 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
11500 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
11510 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
11520 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50  nknown";..}..LAP
11530 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11540 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
11550 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d  n_cache_mode", m
11560 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  sg, -1);.    }..
11570 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
11580 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
11590 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
115a0 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
115b0 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
115c0 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
115d0 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
115e0 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
115f0 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
11600 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
11610 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
11620 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
11630 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
11640 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
11650 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
11660 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
11670 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
11680 5d 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  ];...for (int i 
11690 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39  = 0; i < sk_X509
116a0 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73  _NAME_num(ca_lis
116b0 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  t); i++) {..    
116c0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20  X509_NAME *name 
116d0 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76  = sk_X509_NAME_v
116e0 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29  alue(ca_list, i)
116f0 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29  ;..    if (name)
11700 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f   {...X509_NAME_o
11710 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66  neline(name, buf
11720 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09  fer, BUFSIZ);...
11730 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11740 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11750 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
11760 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65  wStringObj(buffe
11770 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  r, -1));..    }.
11780 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  .}.    }.    LAP
11790 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
117a0 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
117b0 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  ", listPtr);.   
117c0 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
117d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61  erp, objPtr, "ca
117e0 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58  ListCount", sk_X
117f0 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
11800 6c 69 73 74 29 29 3b 0a 0a 0a 20 20 20 20 54 63  list));...    Tc
11810 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11820 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
11830 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
11840 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
11850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11890 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64   *. * MiscObjCmd
118a0 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64   -- misc command
118b0 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
118c0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
118d0 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
118e0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
118f0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
11900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11940 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
11950 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  MiscObjCmd(Clien
11960 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
11970 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
11980 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
11990 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
119a0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61  bjv[]) {.    sta
119b0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
119c0 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20  commands [] = { 
119d0 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c  "req", "strreq",
119e0 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75   NULL };.    enu
119f0 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45  m command { C_RE
11a00 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44  Q, C_STRREQ, C_D
11a10 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f  UMMY };.    Tcl_
11a20 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e  Size cmd;.    in
11a30 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  t isStr;.    cha
11a40 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
11a50 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
11a60 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
11a70 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
11a80 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
11a90 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
11aa0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11ab0 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
11ac0 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
11ad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11ae0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
11af0 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
11b00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11b10 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
11b20 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64  ommand", 0, &cmd
11b30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
11b40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11b50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
11b60 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
11b70 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
11b80 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
11b90 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
11ba0 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
11bb0 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
11bc0 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
11bd0 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
11be0 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
11bf0 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
11c00 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
11c10 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
11c20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
11c30 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  ;..    Tcl_Size 
11c40 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20  listc;..    int 
11c50 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75  i;...    BIO *ou
11c60 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68  t=NULL;...    ch
11c70 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54  ar *k_C="",*k_ST
11c80 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f  ="",*k_L="",*k_O
11c90 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f  ="",*k_OU="",*k_
11ca0 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22  CN="",*k_Email="
11cb0 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65  ";..    char *ke
11cc0 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74  yout,*pemout,*st
11cd0 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73  r;..    int keys
11ce0 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79  ize,serial=0,day
11cf0 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e  s=365;..#if OPEN
11d00 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
11d10 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
11d20 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e  ..    BIGNUM *bn
11d30 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52  e = NULL;..    R
11d40 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a  SA *rsa = NULL;.
11d50 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50  #else..    EVP_P
11d60 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  KEY_CTX *ctx = N
11d70 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20  ULL;.#endif...  
11d80 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c    if ((objc<5) |
11d90 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09  | (objc>6)) {...
11da0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11db0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11dc0 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69  , "keysize keyfi
11dd0 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66  le certfile ?inf
11de0 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  o?");...return T
11df0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
11e00 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ...    if (Tcl_G
11e10 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
11e20 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b  erp, objv[2], &k
11e30 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f  eysize) != TCL_O
11e40 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
11e50 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
11e60 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f  .    keyout=Tcl_
11e70 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
11e80 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d  ]);..    pemout=
11e90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11ea0 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20  jv[4]);..    if 
11eb0 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f  (isStr) {...Tcl_
11ec0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
11ed0 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63  yout,"",0);...Tc
11ee0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
11ef0 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20  pemout,"",0);.. 
11f00 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f     }...    if (o
11f10 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28  bjc>=6) {...if (
11f20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
11f30 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
11f40 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20  bjv[5], &listc, 
11f50 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
11f60 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
11f70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
11f80 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
11f90 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
11fa0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
11fb0 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
11fc0 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
11fd0 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
11fe0 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
11ff0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
12000 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
12010 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
12020 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
12030 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
12040 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
12050 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
12060 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
12070 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
12080 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
12090 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
120a0 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
120b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
120c0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
120d0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
120e0 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
120f0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
12100 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
12110 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
12120 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
12130 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12140 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
12150 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
12160 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
12170 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
12180 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
12190 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
121a0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
121b0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
121c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
121d0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
121e0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
121f0 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
12200 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
12210 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12220 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
12230 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12240 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
12250 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
12260 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
12270 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
12280 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
12290 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
122a0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
122b0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
122c0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
122d0 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
122e0 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
122f0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
12300 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
12310 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
12320 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
12330 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
12340 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12350 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
12360 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
12370 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
12380 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
12390 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
123a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
123b0 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
123c0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
123d0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
123e0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
123f0 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
12400 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
12410 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
12420 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
12430 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
12440 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
12450 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
12460 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
12470 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
12480 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
12490 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
124a0 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
124b0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
124c0 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
124d0 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
124e0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
124f0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
12500 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
12510 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
12520 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
12530 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
12540 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
12550 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
12560 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
12570 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
12580 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
12590 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
125a0 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
125b0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
125c0 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
125d0 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
125e0 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
125f0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
12600 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
12610 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
12620 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
12630 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
12640 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
12650 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
12660 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
12670 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
12680 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
12690 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
126a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
126b0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
126c0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
126d0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
126e0 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
126f0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
12700 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
12710 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
12720 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
12730 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
12740 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
12750 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
12760 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
12770 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
12780 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
12790 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
127a0 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
127b0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
127c0 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
127d0 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
127e0 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
127f0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
12800 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
12810 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
12820 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
12830 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
12840 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
12850 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
12860 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
12870 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
12880 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
12890 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
128a0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
128b0 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
128c0 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
128d0 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
128e0 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
128f0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
12900 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
12910 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
12920 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
12930 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
12940 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
12950 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
12960 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
12970 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
12980 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
12990 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
129a0 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
129b0 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09  rn(TCL_ERROR);..
129c0 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76  .}....X509_set_v
129d0 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a  ersion(cert,2);.
129e0 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73  ..ASN1_INTEGER_s
129f0 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69  et(X509_get_seri
12a00 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73  alNumber(cert),s
12a10 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67  erial);...X509_g
12a20 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
12a30 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65  etm_notBefore(ce
12a40 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67  rt),0);...X509_g
12a50 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67  mtime_adj(X509_g
12a60 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72  etm_notAfter(cer
12a70 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32  t),(long)60*60*2
12a80 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f  4*days);...X509_
12a90 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c  set_pubkey(cert,
12aa0 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58  pkey);....name=X
12ab0 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f  509_get_subject_
12ac0 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58  name(cert);....X
12ad0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12ae0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12af0 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  C", MBSTRING_ASC
12b00 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
12b10 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d  d char *) k_C, -
12b20 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
12b30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
12b40 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54  _by_txt(name,"ST
12b50 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
12b60 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
12b70 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d   char *) k_ST, -
12b80 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
12b90 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
12ba0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22  _by_txt(name,"L"
12bb0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
12bc0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
12bd0 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c  char *) k_L, -1,
12be0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
12bf0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
12c00 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20  y_txt(name,"O", 
12c10 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
12c20 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
12c30 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d  ar *) k_O, -1, -
12c40 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
12c50 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
12c60 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d  txt(name,"OU", M
12c70 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
12c80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12c90 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d  r *) k_OU, -1, -
12ca0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
12cb0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
12cc0 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d  txt(name,"CN", M
12cd0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
12ce0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12cf0 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d  r *) k_CN, -1, -
12d00 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
12d10 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
12d20 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22  txt(name,"Email"
12d30 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
12d40 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
12d50 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c  char *) k_Email,
12d60 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09   -1, -1, 0);....
12d70 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74  X509_set_subject
12d80 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29  _name(cert,name)
12d90 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73  ;....if (!X509_s
12da0 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56  ign(cert,pkey,EV
12db0 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09  P_sha256())) {..
12dc0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63  .    X509_free(c
12dd0 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f  ert);...    EVP_
12de0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
12df0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
12e00 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
12e10 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20  30000000L...    
12e20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
12e30 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53  ndif...    Tcl_S
12e40 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
12e50 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63  "Error signing c
12e60 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c  ertificate",NULL
12e70 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20  );...    return 
12e80 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a  TCL_ERROR;...}..
12e90 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
12ea0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
12eb0 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
12ec0 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
12ed0 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
12ee0 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72  );...    i=BIO_r
12ef0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73  ead(out,buffer,s
12f00 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29  izeof(buffer)-1)
12f10 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20  ;...    i=(i<0) 
12f20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62  ? 0 : i;...    b
12f30 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09  uffer[i]='\0';..
12f40 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
12f50 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75  interp,pemout,bu
12f60 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42  ffer,0);...    B
12f70 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09  IO_flush(out);..
12f80 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75  .    BIO_free(ou
12f90 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t);...} else {..
12fa0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
12fb0 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
12fc0 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f  ..    BIO_write_
12fd0 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d  filename(out,pem
12fe0 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  out);...    PEM_
12ff0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
13000 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
13010 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
13020 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66  );...}....X509_f
13030 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50  ree(cert);...EVP
13040 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
13050 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
13060 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13070 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f  x30000000L...BN_
13080 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
13090 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65  f..    }..}..bre
130a0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
130b0 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ..break;.    }. 
130c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
130d0 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
130f0 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  Init            
13100 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
13120 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46  ----. *. * Tls_F
13170 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ree --. *. *.Thi
13180 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
13190 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
131a0 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
131b0 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
131c0 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
131d0 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
131e0 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52   below 1. *. * R
131f0 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
13200 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
13210 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
13220 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13270 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73  ---. */.void.Tls
13280 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63  _Free(char *bloc
13290 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74  kPtr) {.    Stat
132a0 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
132b0 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b  tate *)blockPtr;
132c0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
132d0 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c  alled");..    Tl
132e0 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72  s_Clean(statePtr
132f0 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c  );.    ckfree(bl
13300 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  ockPtr);.}.../*.
13310 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13350 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
13360 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54  Clean --. *. *.T
13370 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
13380 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
13390 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
133a0 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
133b0 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
133c0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
133d0 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69  ls below 1.  Thi
133e0 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63  s should. *.be c
133f0 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75  alled synchronou
13400 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65  sly by the Close
13410 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Proc, not in the
13420 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72  . *.EventuallyFr
13430 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  ee callback.. *.
13440 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
13450 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
13460 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
13470 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
13480 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
134d0 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65   Tls_Clean(State
134e0 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20   *statePtr) {.  
134f0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
13500 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  d");..    /*.   
13510 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69    * we're assumi
13520 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27  ng here that we'
13530 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  re single-thread
13540 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed.     */.    i
13550 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  f (statePtr->tim
13560 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72  er != (Tcl_Timer
13570 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09  Token) NULL) {..
13580 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48  Tcl_DeleteTimerH
13590 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d  andler(statePtr-
135a0 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50  >timer);..stateP
135b0 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c  tr->timer = NULL
135c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
135d0 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
135e0 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61  s) {..ckfree(sta
135f0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a  tePtr->protos);.
13600 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
13610 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  s = NULL;.    }.
13620 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
13630 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69  ->bio) {../* Thi
13640 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f  s will call SSL_
13650 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34  shutdown. Bug 14
13660 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74  14045 */..dprint
13670 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  f("BIO_free_all(
13680 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  %p)", statePtr->
13690 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f  bio);..BIO_free_
136a0 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  all(statePtr->bi
136b0 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62  o);..statePtr->b
136c0 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  io = NULL;.    }
136d0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
136e0 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e  r->ssl) {..dprin
136f0 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29  tf("SSL_free(%p)
13700 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ", statePtr->ssl
13710 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61  );..SSL_free(sta
13720 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74  tePtr->ssl);..st
13730 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55  atePtr->ssl = NU
13740 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
13750 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29   (statePtr->ctx)
13760 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65   {..SSL_CTX_free
13770 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
13780 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20  ..statePtr->ctx 
13790 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
137a0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
137b0 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c  callback) {..Tcl
137c0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _DecrRefCount(st
137d0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
137e0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61  );..statePtr->ca
137f0 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  llback = NULL;. 
13800 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
13810 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
13820 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
13830 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70  ount(statePtr->p
13840 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65  assword);..state
13850 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20  Ptr->password = 
13860 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
13870 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
13880 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  md) {..Tcl_DecrR
13890 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
138a0 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50  ->vcmd);..stateP
138b0 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b  tr->vcmd = NULL;
138c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
138d0 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29  ntf("Returning")
138e0 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c 5f 4d 41  ;.}...#if TCL_MA
138f0 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a  JOR_VERSION > 8.
13900 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53  #define MIN_VERS
13910 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a  ION "9.0".#else.
13920 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53  #define MIN_VERS
13930 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66  ION "8.5".#endif
13940 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13990 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a   Tls_Init --. *.
139a0 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
139b0 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
139c0 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77  ion procedure, w
139d0 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20  hich is called. 
139e0 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68  *.by Tcl when th
139f0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f  is package is to
13a00 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20   be added to an 
13a10 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a  interpreter.. *.
13a20 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c   * Results:  Ssl
13a30 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
13a40 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64  loaded. *. * Sid
13a50 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63  e effects:. *. c
13a60 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f  reate the ssl co
13a70 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a  mmand, initializ
13a80 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a  e ssl context. *
13a90 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
13aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ad0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58  ------. */.DLLEX
13ae0 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69  PORT int Tls_Ini
13af0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
13b00 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73  terp) {.    cons
13b10 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69  t char tlsTclIni
13b20 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69  tScript[] = {.#i
13b30 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e  nclude "tls.tcl.
13b40 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a  h"..0x00.    };.
13b50 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13b60 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20  lled");..#ifdef 
13b70 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20  USE_TCL_STUBS.  
13b80 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74    if (Tcl_InitSt
13b90 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f  ubs(interp, MIN_
13ba0 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e  VERSION, 0) == N
13bb0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
13bc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13bd0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54  #endif.    if (T
13be0 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e  cl_PkgRequire(in
13bf0 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e  terp, "Tcl", MIN
13c00 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20  _VERSION, 0) == 
13c10 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
13c20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13c30 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62  ..    if (TlsLib
13c40 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f  Init(0) != TCL_O
13c50 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  K) {..Tcl_Append
13c60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13c70 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61  could not initia
13c80 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79  lize SSL library
13c90 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
13ca0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
13cb0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
13cc0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
13cd0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
13ce0 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c  ls::connection",
13cf0 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
13d00 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
13d10 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
13d20 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
13d30 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
13d40 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13d50 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61  interp, "tls::ha
13d60 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
13d70 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  akeObjCmd, (Clie
13d80 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
13d90 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
13da0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
13db0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
13dc0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
13dd0 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72  ::import", Impor
13de0 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
13df0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
13e00 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
13e10 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
13e20 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
13e30 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
13e40 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d  misc", MiscObjCm
13e50 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
13e60 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
13e70 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
13e80 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
13e90 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13ea0 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f  rp, "tls::unimpo
13eb0 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  rt", UnimportObj
13ec0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
13ed0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
13ee0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
13ef0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
13f00 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
13f10 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74  terp, "tls::stat
13f20 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
13f30 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
13f40 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
13f50 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
13f60 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 44 69 67 65  );..    Tls_Dige
13f70 73 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72  stCommands(inter
13f80 70 29 3b 0a 20 20 20 20 54 6c 73 5f 45 6e 63 72  p);.    Tls_Encr
13f90 79 70 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65  yptCommands(inte
13fa0 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e 66  rp);.    Tls_Inf
13fb0 6f 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70  oCommands(interp
13fc0 29 3b 0a 20 20 20 20 54 6c 73 5f 4b 44 46 43 6f  );.    Tls_KDFCo
13fd0 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a  mmands(interp);.
13fe0 20 20 20 20 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d      Tls_RandComm
13ff0 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20  ands(interp);.. 
14000 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b     if (interp) {
14010 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72  ..Tcl_Eval(inter
14020 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72  p, tlsTclInitScr
14030 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ipt);.    }..   
14040 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50   return Tcl_PkgP
14050 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50  rovide(interp, P
14060 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43  ACKAGE_NAME, PAC
14070 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d  KAGE_VERSION);.}
14080 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
14090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
140c0 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69  *. *.Tls_SafeIni
140d0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  t --. *. *.-----
140e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
14110 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75  Standard procedu
14120 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27  re required by '
14130 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61  load'.. *.Initia
14140 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e  lizes this exten
14150 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20  sion for a safe 
14160 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09  interpreter.. *.
14170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141a0 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66  *. *. *.Side eff
141b0 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20  ects:. *..As of 
141c0 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a  'Tls_Init'. *. *
141d0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73  .Result:. *..A s
141e0 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f  tandard Tcl erro
141f0 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  r code.. *. *---
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14230 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f  ---*. */.DLLEXPO
14240 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49  RT int Tls_SafeI
14250 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
14260 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70  interp) {.    dp
14270 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
14280 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f  .    return(Tls_
14290 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d  Init(interp));.}
142a0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
142b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
142e0 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20  *. *.TlsLibInit 
142f0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e  ---------*. *.In
14330 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
14340 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61  brary once per a
14350 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d  pplication. *.--
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
14390 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
143a0 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69  ts:. *..initiali
143b0 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a  zes SSL library.
143c0 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a   *. *.Result:. *
143d0 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ..none. *. *----
143e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14410 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  --*. */.static i
14420 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e  nt TlsLibInit(in
14430 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20  t uninitialize) 
14440 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74  {.    static int
14450 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30   initialized = 0
14460 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73  ;.    int status
14470 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64   = TCL_OK;.#if d
14480 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
14490 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
144a0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
144b0 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c      size_t num_l
144c0 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ocks;.#endif..  
144d0 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69    if (uninitiali
144e0 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74  ze) {..if (!init
144f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20  ialized) {..    
14500 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
14510 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20  o uninitialize, 
14520 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69  but we are not i
14530 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09  nitialized");...
14540 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f      return(TCL_O
14550 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66  K);..}...dprintf
14560 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69  ("Asked to unini
14570 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20  tialize");..#if 
14580 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
14590 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
145a0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
145b0 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28  ..Tcl_MutexLock(
145c0 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20  &init_mx);...if 
145d0 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66  (locks) {..    f
145e0 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20  ree(locks);..   
145f0 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09   locks = NULL;..
14600 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d      locksCount =
14610 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69   0;..}.#endif..i
14620 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
14630 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
14640 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
14650 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
14660 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
14670 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
14680 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
14690 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d  n(TCL_OK);.    }
146a0 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61  ..    if (initia
146b0 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74  lized) {..dprint
146c0 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75  f("Called, but u
146d0 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75  sing cached valu
146e0 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61  e");..return(sta
146f0 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tus);.    }..   
14700 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
14710 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ");..#if defined
14720 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
14730 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
14740 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63  _THREADS).    Tc
14750 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
14760 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t_mx);.#endif.  
14770 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20    initialized = 
14780 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  1;..#if defined(
14790 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
147a0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
147b0 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d  THREADS).    num
147c0 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20  _locks = 1;.    
147d0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e  locksCount = (in
147e0 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20  t) num_locks;.  
147f0 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63    locks = malloc
14800 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20  (sizeof(*locks) 
14810 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20  * num_locks);.  
14820 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20    memset(locks, 
14830 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  0, sizeof(*locks
14840 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
14850 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
14860 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c  nitialize BOTH l
14870 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62  ibcrypto and lib
14880 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e  ssl. */.    OPEN
14890 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45  SSL_init_ssl(OPE
148a0 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53  NSSL_INIT_LOAD_S
148b0 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45  SL_STRINGS | OPE
148c0 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43  NSSL_INIT_LOAD_C
148d0 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c  RYPTO_STRINGS..|
148e0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44   OPENSSL_INIT_AD
148f0 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20  D_ALL_CIPHERS | 
14900 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44  OPENSSL_INIT_ADD
14910 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55  _ALL_DIGESTS, NU
14920 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65  LL);..    BIO_ne
14930 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a  w_tcl(NULL, 0);.
14940 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20  .#if 0.    /*.  
14950 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52     * XXX:TODO: R
14960 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20  emove this code 
14970 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77  and replace it w
14980 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20  ith a check.    
14990 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e   * for enough en
149a0 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74  tropy and do not
149b0 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f   try to create o
149c0 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65  ur own.     * te
149d0 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20  rrible entropy. 
149e0 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20      */.    /*.  
149f0 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61     * Seed the ra
14a00 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
14a10 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c  rator in the SSL
14a20 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a   library,.     *
14a30 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68   using the do/wh
14a40 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65  ile construct be
14a50 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67  cause of the bug
14a60 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20   note in the.   
14a70 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20    * OpenSSL FAQ 
14a80 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70  at http://www.op
14a90 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72  enssl.org/suppor
14aa0 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31  t/faq.html#USER1
14ab0 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54  .     *.     * T
14ac0 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70  he crux of the p
14ad0 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53  roblem is that S
14ae0 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f  olaris 7 does no
14af0 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20  t have a.     * 
14b00 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f  /dev/random or /
14b10 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69  dev/urandom devi
14b20 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20  ce so it cannot 
14b30 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20  gather enough.  
14b40 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f     * entropy fro
14b50 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28  m the RAND_seed(
14b60 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69  ) when TLS initi
14b70 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73  alizes and refus
14b80 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20  es.     * to go 
14b90 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72  further. Earlier
14ba0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65   versions of Ope
14bb0 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20  nSSL carried on 
14bc0 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
14bd0 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75   */.    srand((u
14be0 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d  nsigned int) tim
14bf0 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c  e((time_t *) NUL
14c00 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66  L));.    do {..f
14c10 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31  or (i = 0; i < 1
14c20 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72  6; i++) {..    r
14c30 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b  nd_seed[i] = 1 +
14c40 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a   (char) (255.0 *
14c50 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41   rand()/(RAND_MA
14c60 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e  X+1.0));..}..RAN
14c70 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c  D_seed(rnd_seed,
14c80 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64   sizeof(rnd_seed
14c90 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20  ));.    } while 
14ca0 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21  (RAND_status() !
14cb0 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  = 1);.#endif..#i
14cc0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
14cd0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
14ce0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
14cf0 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78  S).    Tcl_Mutex
14d00 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
14d10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65  ;.#endif..    re
14d20 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a  turn(status);.}.