Hex Artifact Content

Artifact b9807f786748ba7b97c5d4f61c531818817b592c1984dc4d780da140bd9048a0:


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 0a 20      FILE *fd;.. 
3560: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
3570: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
3580: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65  tr) {..fd = fope
3590: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70  n(str, "a");..fp
35a0: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22  rintf(fd, "%s\n"
35b0: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28  ,line);..fclose(
35c0: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  fd);.    }.}.../
35d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 50 61  -------. *. * Pa
3620: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20  ssword Callback 
3630: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3640: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20  when a password 
3650: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3660: 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e  y loading/storin
3670: 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69  g a PEM. *.certi
3680: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72  ficate with encr
3690: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61  yption. Evals ca
36a0: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e  llback script an
36b0: 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65  d returns. *.the
36c0: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70   result as the p
36d0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69  assword string i
36e0: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73  n buf.. *. * Res
36f0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
3700: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3710: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
3720: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
3730: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
3740: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65   *.Password size
3750: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20   in bytes or -1 
3760: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a  for an error.. *
3770: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3780: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
37c0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61  c int.PasswordCa
37d0: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66  llback(char *buf
37e0: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20  , int size, int 
37f0: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64  rwflag, void *ud
3800: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ata) {.    State
3810: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
3820: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20  ate *) udata;.  
3830: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3840: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3850: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3860: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
3870: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20    int code;..   
3880: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3890: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e  ");..    /* If n
38a0: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20  o callback, use 
38b0: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b  default callback
38c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
38d0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
38e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54  = NULL) {..if (T
38f0: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70  cl_EvalEx(interp
3900: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64  , "tls::password
3910: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
3920: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f  GLOBAL) == TCL_O
3930: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  K) {..    char *
3940: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3950: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
3960: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20  lt(interp);..   
3970: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65   strncpy(buf, re
3980: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65  t, (size_t) size
3990: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28  );..    return (
39a0: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b  int)strlen(ret);
39b0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
39c0: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20  return -1;..}.  
39d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
39e0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
39f0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
3a00: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
3a10: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61  Obj(statePtr->pa
3a20: 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c  ssword);.    Tcl
3a30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3a40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3a50: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3a60: 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64  ingObj("password
3a70: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
3a80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3a90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3aa0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3ab0: 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20  Obj(rwflag));.  
3ac0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3ad0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3ae0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3af0: 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b  ewIntObj(size));
3b00: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
3b10: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3b20: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
3b30: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3b40: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3b50: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
3b60: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
3b70: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
3b80: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3b90: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
3ba0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
3bb0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
3bc0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
3bd0: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f  if (code != TCL_
3be0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d  OK) {.#if (TCL_M
3bf0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20  AJOR_VERSION == 
3c00: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52  8) && (TCL_MINOR
3c10: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54  _VERSION < 6)..T
3c20: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
3c30: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73  or(interp);.#els
3c40: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  e..Tcl_Backgroun
3c50: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
3c60: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
3c70: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
3c80: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
3c90: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
3ca0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
3cb0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3cc0: 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73     /* If success
3cd0: 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70  ful, pass back p
3ce0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61  assword string a
3cf0: 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74  nd truncate if t
3d00: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69  oo long */.    i
3d10: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f  f (code == TCL_O
3d20: 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c  K) {..Tcl_Size l
3d30: 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d  en;..char *ret =
3d40: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
3d50: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54  tStringFromObj(T
3d60: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3d70: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a  interp), &len);.
3d80: 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f  .if (len > (Tcl_
3d90: 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a  Size) size-1) {.
3da0: 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f  .    len = (Tcl_
3db0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d  Size) size-1;..}
3dc0: 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72  ..strncpy(buf, r
3dd0: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  et, (size_t) len
3de0: 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27  );..buf[len] = '
3df0: 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73  \0';..Tcl_Releas
3e00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3e10: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28  nterp);..return(
3e20: 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20  (int) len);.    
3e30: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
3e40: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3e50: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
3e60: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn -1;.}.../*. *
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 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 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f  ---. *. * Sessio
3ec0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  n Callback for C
3ed0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
3ee0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  Called when a ne
3ef0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64  w session is add
3f00: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e  ed to the cache.
3f10: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74   In TLS 1.3. *.t
3f20: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69  his may be recei
3f30: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ved multiple tim
3f40: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e  es after the han
3f50: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65  dshake. For. *.e
3f60: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c  arlier versions,
3f70: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
3f80: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68  ceived during th
3f90: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
3fa0: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66  This is the pref
3fb0: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74  erred way to obt
3fc0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20  ain a resumable 
3fd0: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  session.. *. * R
3fe0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3ff0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4000: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
4010: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4020: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4030: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72  codes:. *.0 = er
4040: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f  ror where sessio
4050: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69  n will be immedi
4060: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72  ately removed fr
4070: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
4080: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75  cache.. *.1 = su
4090: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20  ccess where app 
40a0: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20  retains session 
40b0: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65  in session cache
40c0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20  , and must call 
40d0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65  SSL_SESSION_free
40e0: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a  () when done.. *
40f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4100: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4140: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c  c int.SessionCal
4150: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
4160: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
4170: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
4180: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4190: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
41a0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
41b0: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
41c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
41d0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
41e0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
41f0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
4200: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4210: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4220: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4230: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4240: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
4250: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
4260: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
4270: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4280: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4290: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
42a0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
42b0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
42c0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
42d0: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
42e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
42f0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4300: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4310: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4320: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4330: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4340: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4350: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
4360: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4370: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4380: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4390: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
43a0: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29  ("session", -1))
43b0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
43c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
43d0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
43e0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
43f0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
4400: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
4410: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a  ->self), -1));..
4420: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
4430: 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  d */.    session
4440: 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
4450: 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
4460: 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63  , &ulen);.    Tc
4470: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4480: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4490: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  mdPtr, Tcl_NewBy
44a0: 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69  teArrayObj(sessi
44b0: 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
44c0: 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f  ) ulen));..    /
44d0: 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
44e0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53   */.    SSL_SESS
44f0: 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28  ION_get0_ticket(
4500: 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
4510: 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63  , &len2);.    Tc
4520: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4530: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4540: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  mdPtr, Tcl_NewBy
4550: 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65  teArrayObj(ticke
4560: 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
4570: 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69  n2));..    /* Li
4580: 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20  fetime - number 
4590: 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20  of seconds */.  
45a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
45b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
45c0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f  p, cmdPtr,..Tcl_
45d0: 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67  NewLongObj((long
45e0: 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ) SSL_SESSION_ge
45f0: 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d  t_ticket_lifetim
4600: 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29  e_hint(session))
4610: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
4620: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
4630: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
4640: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
4650: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
4660: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
4670: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
4680: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4690: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
46a0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a  return 0;.}.../*
46b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
46c0: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50  ------. *. * ALP
4700: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  N Callback for S
4710: 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43  ervers and NPN C
4720: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65  allback for Clie
4730: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72  nts --. *. *.Per
4740: 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68  form protocol (h
4750: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c  ttp/1.1, h2, h3,
4760: 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e   etc.) selection
4770: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f   for the. *.inco
4780: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ming connection.
4790: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65   Called after He
47a0: 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63  llo and server c
47b0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65  allbacks.. *.Whe
47c0: 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65  re 'out' is sele
47d0: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e  cted protocol an
47e0: 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65  d 'in' is the pe
47f0: 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69  er advertised li
4800: 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  st.. *. * Result
4810: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
4820: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4830: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
4840: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
4850: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
4860: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  :. *.SSL_TLSEXT_
4870: 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f  ERR_OK: ALPN pro
4880: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20  tocol selected. 
4890: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
48a0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
48b0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
48c0: 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77  T_FATAL: There w
48d0: 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65  as no overlap be
48e0: 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74  tween the client
48f0: 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69  's. *.    suppli
4900: 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ed list and the 
4910: 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61  server configura
4920: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63  tion. The connec
4930: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f  tion will be abo
4940: 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  rted.. *.SSL_TLS
4950: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41  EXT_ERR_NOACK: A
4960: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  LPN protocol not
4970: 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c   selected, e.g.,
4980: 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e   because no ALPN
4990: 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c  . *.    protocol
49a0: 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  s are configured
49b0: 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63   for this connec
49c0: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63  tion. The connec
49d0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
49e0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
49f0: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61  --------. */.sta
4a30: 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c  tic int.ALPNCall
4a40: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
4a50: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ssl, const unsig
4a60: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20  ned char **out, 
4a70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
4a80: 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e  utlen,..const un
4a90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c  signed char *in,
4aa0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e   unsigned int in
4ab0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
4ac0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
4ad0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
4ae0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
4af0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
4b00: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
4b10: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
4b20: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
4b30: 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72  e, res;..    dpr
4b40: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4b50: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
4b60: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
4b70: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4b80: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4b90: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
4ba0: 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63  /* Select protoc
4bb0: 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53  ol */.    if (SS
4bc0: 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72  L_select_next_pr
4bd0: 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c  oto(out, outlen,
4be0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4bf0: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  s, statePtr->pro
4c00: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e  tos_len,..in, in
4c10: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f  len) == OPENSSL_
4c20: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20  NPN_NEGOTIATED) 
4c30: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e  {../* Match foun
4c40: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f  d */..res = SSL_
4c50: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4c60: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
4c70: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f  OPENSSL_NPN_NO_O
4c80: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72  VERLAP = No over
4c90: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73  lap, so use firs
4ca0: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65  t item from clie
4cb0: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74  nt protocol list
4cc0: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4cd0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4ce0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4cf0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
4d00: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4d10: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b  ) {..return res;
4d20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4d30: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4d40: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
4d50: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4d60: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4d70: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
4d80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4d90: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4da0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4db0: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
4dc0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
4dd0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4de0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4df0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
4e00: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
4e10: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
4e20: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
4e30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4e40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4e50: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4e60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a  l_NewStringObj(*
4e70: 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  out, -1));.    T
4e80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4e90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4ea0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
4eb0: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d  ooleanObj(res ==
4ec0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4ed0: 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  OK));..    /* Ev
4ee0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
4ef0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
4f00: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4f10: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
4f20: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
4f30: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
4f40: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
4f50: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
4f60: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4f70: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
4f80: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
4f90: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4fa0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
4fb0: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  e {..res = SSL_T
4fc0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
4fd0: 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  FATAL;.    }.   
4fe0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4ff0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
5000: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
5010: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5020: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 64  -------. *. * Ad
5060: 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c  vertise Protocol
5070: 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e  s Callback for N
5080: 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67  ext Protocol Neg
5090: 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69  otiation (NPN) i
50a0: 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d  n ServerHello --
50b0: 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68  . *. *.called wh
50c0: 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20  en a TLS server 
50d0: 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20  needs a list of 
50e0: 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63  supported protoc
50f0: 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09  ols for Next. *.
5100: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
5110: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  tion.. *. * Resu
5120: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
5130: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5140: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
5150: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
5160: 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70  XT_ERR_OK: NPN p
5170: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
5180: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5190: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
51a0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
51b0: 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f  ACK: NPN protoco
51c0: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20  l not selected. 
51d0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
51e0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 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 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  --. */.#ifdef US
5240: 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74  E_NPN.static int
5250: 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .NPNCallback(con
5260: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e  st SSL *ssl, con
5270: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5280: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64   **out, unsigned
5290: 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f   int *outlen, vo
52a0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
52b0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
52c0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20   (State*)arg;.. 
52d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
52e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
52f0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
5300: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
5310: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5320: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5330: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f  ..    /* Set pro
5340: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20  tocols list */. 
5350: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5360: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
5370: 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65   {..*out = state
5380: 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f  Ptr->protos;..*o
5390: 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72  utlen = statePtr
53a0: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  ->protos_len;.  
53b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74    } else {..*out
53c0: 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65   = NULL;..*outle
53d0: 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53  n = 0;..return S
53e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
53f0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ACK;.    }.    r
5400: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5410: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  _ERR_OK;.}.#endi
5420: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  f.../*. *-------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a  ------------. *.
5470: 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20   * SNI Callback 
5480: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20  for Servers --. 
5490: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72  *. *.Perform ser
54a0: 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73  ver-side SNI hos
54b0: 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20  tname selection 
54c0: 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20  after receiving 
54d0: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  SNI extension. *
54e0: 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f  .in Client Hello
54f0: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68  . Called after h
5500: 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75  ello callback bu
5510: 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61  t before ALPN ca
5520: 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
5530: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
5540: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
5550: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
5560: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
5570: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
5580: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
5590: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20  EXT_ERR_OK: SNI 
55a0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65  hostname is acce
55b0: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  pted. The connec
55c0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
55d0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
55e0: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53  R_ALERT_FATAL: S
55f0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
5600: 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  ot accepted. The
5610: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20   connection. *. 
5620: 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44     is aborted. D
5630: 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74  efault for alert
5640: 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43   is SSL_AD_UNREC
5650: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a  OGNIZED_NAME.. *
5660: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
5670: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53  ALERT_WARNING: S
5680: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
5690: 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72  ot accepted, war
56a0: 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20  ning alert. *.  
56b0: 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70    sent (not supp
56c0: 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33  orted in TLSv1.3
56d0: 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ). The connectio
56e0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
56f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5700: 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  OACK: SNI hostna
5710: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5720: 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f  ed and not ackno
5730: 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20  wledged,. *.    
5740: 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20  e.g. if SNI has 
5750: 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  not been configu
5760: 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  red. The connect
5770: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5780: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5790: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
57d0: 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61  ic int.SNICallba
57e0: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
57f0: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
5800: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
5810: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
5820: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
5830: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
5840: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
5850: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
5860: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
5870: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73     int code, res
5880: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76  ;.    char *serv
5890: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  ername = NULL;..
58a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
58b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
58c0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
58d0: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
58e0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
58f0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5900: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77  }..    /* Only w
5910: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32  orks for TLS 1.2
5920: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a   and earlier */.
5930: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
5940: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e   SSL_get_servern
5950: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
5960: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
5970: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65  me);.    if (!se
5980: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76  rvername || serv
5990: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30  ername[0] == '\0
59a0: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ') {..return SSL
59b0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
59c0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
59d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
59e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
59f0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
5a00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5a10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5a20: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
5a30: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
5a40: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
5a50: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
5a60: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
5a70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5a80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5a90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5aa0: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29  ngObj("sni", -1)
5ab0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5ac0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5ad0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
5ae0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
5af0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
5b00: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
5b10: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
5b20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5b30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5b40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5b50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65  _NewStringObj(se
5b60: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b  rvername , -1));
5b70: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5b80: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5b90: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5ba0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5bb0: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5bc0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5bd0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5be0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
5bf0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5c00: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
5c10: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  NG;..*alert = SS
5c20: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5c30: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
5c40: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
5c50: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73  1.3 */.    } els
5c60: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
5c70: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5c80: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
5c90: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
5ca0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5cb0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61  ALERT_FATAL;..*a
5cc0: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e  lert = SSL_AD_UN
5cd0: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b  RECOGNIZED_NAME;
5ce0: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65   /* Not supporte
5cf0: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a  d by TLS 1.3 */.
5d00: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
5d10: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5d20: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
5d30: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  es;.}.../*. *---
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c  . *. * ClientHel
5d90: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c  lo Handshake Cal
5da0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
5db0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20  s --. *. *.Used 
5dc0: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61  by server to exa
5dd0: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20  mine the server 
5de0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
5df0: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a  (SNI) extension.
5e00: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74   *.provided by t
5e10: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64  he client in ord
5e20: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20  er to select an 
5e30: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74  appropriate cert
5e40: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72  ificate to. *.pr
5e50: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20  esent, and make 
5e60: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
5e70: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ion adjustments 
5e80: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74  relevant to that
5e90: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20   server. *.name 
5ea0: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72  and its configur
5eb0: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c  ation. This incl
5ec0: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75  udes swapping ou
5ed0: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
5ee0: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e  . *.SSL_CTX poin
5ef0: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74  ter, modifying t
5f00: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74  he server's list
5f10: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c   of permitted TL
5f20: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63  S versions,. *.c
5f30: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76  hanging the serv
5f40: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74  er's cipher list
5f50: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
5f60: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70  the client's cip
5f70: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20  her list, etc.. 
5f80: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  *.Called before 
5f90: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c  SNI and ALPN cal
5fa0: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65  lbacks.. *. * Re
5fb0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
5fc0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
5fd0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
5fe0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
5ff0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
6000: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49  odes:. *.SSL_CLI
6010: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a  ENT_HELLO_RETRY:
6020: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e   suspend the han
6030: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20  dshake, and the 
6040: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69  handshake functi
6050: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69  on will return i
6060: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53  mmediately. *.SS
6070: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6080: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74  RROR: failure, t
6090: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74  erminate connect
60a0: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74  ion. Set alert t
60b0: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  o error code.. *
60c0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
60d0: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65  O_SUCCESS: succe
60e0: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ss. *. *--------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a  -----------. */.
6130: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f  static int.Hello
6140: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
6150: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
6160: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
6170: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
6180: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
6190: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
61a0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
61b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
61c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
61d0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
61e0: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73  e, res;.    cons
61f0: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61  t char *serverna
6200: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  me;.    const un
6210: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
6220: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20      size_t len, 
6230: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20  remaining;..    
6240: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6250: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
6260: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
6270: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
6280: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6290: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
62a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
62b0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53  (ssl == (const S
62c0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67  SL *)NULL || arg
62d0: 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c   == (void *)NULL
62e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
62f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6300: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6310: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20  * Get names */. 
6320: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65     if (!SSL_clie
6330: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78  nt_hello_get0_ex
6340: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59  t(ssl, TLSEXT_TY
6350: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20  PE_server_name, 
6360: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20  &p, &remaining) 
6370: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  || remaining <= 
6380: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
6390: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54  SL_R_SSLV3_ALERT
63a0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54  _ILLEGAL_PARAMET
63b0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ER;..return SSL_
63c0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
63d0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
63e0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65  * Extract the le
63f0: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70  ngth of the supp
6400: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d  lied list of nam
6410: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d  es. */.    len =
6420: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6430: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6440: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6450: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29   2 != remaining)
6460: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6470: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
6480: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
6490: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
64a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
64b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
64c0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20  ining = len;..  
64d0: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e    /* The list in
64e0: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68   practice only h
64f0: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d  as a single elem
6500: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20  ent, so we only 
6510: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72  consider the fir
6520: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  st one. */.    i
6530: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  f (remaining == 
6540: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53  0 || *p++ != TLS
6550: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
6560: 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72  t_name) {..*aler
6570: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6580: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6590: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  RROR;..return SS
65a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
65b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
65c0: 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20  remaining--;..  
65d0: 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20    /* Now we can 
65e0: 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74  finally pull out
65f0: 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20   the byte array 
6600: 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20  with the actual 
6610: 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  hostname. */.   
6620: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c   if (remaining <
6630: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  = 2) {..*alert =
6640: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6650: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6660: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6670: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6680: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  R;.    }.    len
6690: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29   = (*(p++) << 8)
66a0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70  ;.    len += *(p
66b0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e  ++);.    if (len
66c0: 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67   + 2 > remaining
66d0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
66e0: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
66f0: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6700: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6710: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6720: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6730: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73  ing = len;.    s
6740: 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e  ervername = (con
6750: 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20  st char *)p;..  
6760: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
6770: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
6780: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
6790: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
67a0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
67b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
67c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
67d0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
67e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c  ewStringObj("hel
67f0: 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lo", -1));.    T
6800: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6810: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6820: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
6830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
6840: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
6850: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
6860: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
6870: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6880: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6890: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
68a0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65  ngObj(servername
68b0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
68c0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
68d0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
68e0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
68f0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6900: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65  );.    if ((code
6910: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
6920: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
6930: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20  , cmdPtr)) > 1) 
6940: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49  {..res = SSL_CLI
6950: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b  ENT_HELLO_RETRY;
6960: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6970: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45  _TLSV1_ALERT_USE
6980: 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20  R_CANCELLED;.   
6990: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
69a0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
69b0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
69c0: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20  _SUCCESS;.    } 
69d0: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
69e0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
69f0: 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  RROR;..*alert = 
6a00: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6a10: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6a20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
6a30: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
6a40: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
6a50: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a   res;.}.../*****
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6a70: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20  ./* Commands    
6a80: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
6aa0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
6ab0: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 48  --------. *. * H
6af0: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d  andshakeObjCmd -
6b00: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d  -. *. *.This com
6b10: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
6b20: 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74  verify whether t
6b30: 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20  he handshake is 
6b40: 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e  complete. *.or n
6b50: 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ot.. *. * Result
6b60: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
6b70: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d   Tcl result. 1 m
6b80: 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63  eans handshake c
6b90: 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73  omplete, 0 means
6ba0: 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20   pending.. *. * 
6bb0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6bc0: 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e  .May force SSL n
6bd0: 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61  egotiation to ta
6be0: 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d  ke place.. *. *-
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6c40: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  t HandshakeObjCm
6c50: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
6c60: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
6c70: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
6c80: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
6c90: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
6ca0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
6cb0: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  chan;        /* 
6cc0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
6cd0: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
6ce0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
6cf0: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ePtr;        /* 
6d00: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
6d10: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
6d20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65     const char *e
6d30: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrStr = NULL;.  
6d40: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20    int ret = 1;. 
6d50: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a     int err = 0;.
6d60: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
6d70: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
6d80: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
6d90: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6da0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
6db0: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
6dc0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
6dd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
6de0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
6df0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
6e00: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
6e10: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
6e20: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
6e30: 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c  (Tcl_Size *) NUL
6e40: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
6e50: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
6e60: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
6e70: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
6e80: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
6e90: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
6ea0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
6eb0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
6ec0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
6ed0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
6ee0: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
6ef0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
6f00: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
6f10: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
6f20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6f30: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
6f40: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
6f50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
6f60: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
6f70: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
6f80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  ", NULL);..Tcl_S
6f90: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
6fa0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44  rp, "TLS", "HAND
6fb0: 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c  SHAKE", "CHANNEL
6fc0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
6fd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
6fe0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
6ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
7000: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
7010: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
7020: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
7030: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
7040: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
7050: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20  ForConnect");.  
7060: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74    ret = Tls_Wait
7070: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
7080: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20  Ptr, &err, 1);. 
7090: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f     dprintf("Tls_
70a0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72  WaitForConnect r
70b0: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65  eturned: %i", re
70c0: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74  t);..    if (ret
70d0: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50   < 0 && ((stateP
70e0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
70f0: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65  TCL_ASYNC) && (e
7100: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20  rr == EAGAIN))) 
7110: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e  {..dprintf("Asyn
7120: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20  c set and err = 
7130: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d  EAGAIN");..ret =
7140: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   0;.    } else i
7150: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c  f (ret < 0) {..l
7160: 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72  ong result;..err
7170: 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  Str = statePtr->
7180: 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52  err;..Tcl_ResetR
7190: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09  esult(interp);..
71a0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72  Tcl_SetErrno(err
71b0: 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72  );...if (!errStr
71c0: 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20   || (*errStr == 
71d0: 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74  0)) {..    errSt
71e0: 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72  r = Tcl_PosixErr
71f0: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a  or(interp);..}..
7200: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7210: 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73  t(interp, "hands
7220: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  hake failed: ", 
7230: 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29  errStr, (char *)
7240: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65   NULL);..if ((re
7250: 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76  sult = SSL_get_v
7260: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
7270: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20  tePtr->ssl)) != 
7280: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20  X509_V_OK) {..  
7290: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
72a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65  lt(interp, " due
72b0: 20 74 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65 72   to: ", X509_ver
72c0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
72d0: 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 28  tring(result), (
72e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
72f0: 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43  }..Tcl_SetErrorC
7300: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
7310: 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20  ", "HANDSHAKE", 
7320: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
7330: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e  *) NULL);..dprin
7340: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43  tf("Returning TC
7350: 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e  L_ERROR with han
7360: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25  dshake failed: %
7370: 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65  s", errStr);..re
7380: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
7390: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69  .    } else {..i
73a0: 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09  f (err != 0) {..
73b0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
73c0: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61   an error with a
73d0: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73   completed hands
73e0: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c  hake: err = %i",
73f0: 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d   err);..}..ret =
7400: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   1;.    }..    d
7410: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
7420: 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61  g TCL_OK with da
7430: 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29  ta \"%i\"", ret)
7440: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
7450: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
7460: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74  cl_NewIntObj(ret
7470: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54  ));.    return(T
7480: 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44  CL_OK);..clientD
7490: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
74a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
74b0: 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f  t char *command_
74c0: 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20  opts [] = {.    
74d0: 22 2d 61 6c 70 6e 22 2c 20 22 2d 63 61 64 69 72  "-alpn", "-cadir
74e0: 22 2c 20 22 2d 63 61 66 69 6c 65 22 2c 20 22 2d  ", "-cafile", "-
74f0: 63 65 72 74 22 2c 20 22 2d 63 65 72 74 66 69 6c  cert", "-certfil
7500: 65 22 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 22  e", "-cipher", "
7510: 2d 63 69 70 68 65 72 73 22 2c 20 22 2d 63 69 70  -ciphers", "-cip
7520: 68 65 72 73 75 69 74 65 73 22 2c 0a 20 20 20 20  hersuites",.    
7530: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 64 68  "-command", "-dh
7540: 70 61 72 61 6d 73 22 2c 20 22 2d 6b 65 79 22 2c  params", "-key",
7550: 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20 22 2d 6d   "-keyfile", "-m
7560: 6f 64 65 6c 22 2c 20 22 2d 70 61 73 73 77 6f 72  odel", "-passwor
7570: 64 22 2c 20 22 2d 70 6f 73 74 5f 68 61 6e 64 73  d", "-post_hands
7580: 68 61 6b 65 22 2c 0a 20 20 20 20 22 2d 72 65 71  hake",.    "-req
7590: 75 65 73 74 22 2c 20 22 2d 72 65 71 75 69 72 65  uest", "-require
75a0: 22 2c 20 22 2d 73 65 63 75 72 69 74 79 5f 6c 65  ", "-security_le
75b0: 76 65 6c 22 2c 20 22 2d 73 65 72 76 65 72 22 2c  vel", "-server",
75c0: 20 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20   "-servername", 
75d0: 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 22  "-session_id", "
75e0: 2d 73 73 6c 32 22 2c 0a 20 20 20 20 22 2d 73 73  -ssl2",.    "-ss
75f0: 6c 33 22 2c 20 22 2d 74 6c 73 31 22 2c 20 22 2d  l3", "-tls1", "-
7600: 74 6c 73 31 2e 31 22 2c 20 22 2d 74 6c 73 31 2e  tls1.1", "-tls1.
7610: 32 22 2c 20 22 2d 74 6c 73 31 2e 33 22 2c 20 22  2", "-tls1.3", "
7620: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
7630: 22 2c 20 22 2d 76 63 6d 64 22 2c 20 4e 55 4c 4c  ", "-vcmd", NULL
7640: 7d 3b 0a 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e  };..enum _comman
7650: 64 5f 6f 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70  d_opts {.    _op
7660: 74 5f 61 6c 70 6e 2c 20 5f 6f 70 74 5f 63 61 64  t_alpn, _opt_cad
7670: 69 72 2c 20 5f 6f 70 74 5f 63 61 66 69 6c 65 2c  ir, _opt_cafile,
7680: 20 5f 6f 70 74 5f 63 65 72 74 2c 20 5f 6f 70 74   _opt_cert, _opt
7690: 5f 63 65 72 74 66 69 6c 65 2c 20 5f 6f 70 74 5f  _certfile, _opt_
76a0: 63 69 70 68 65 72 2c 20 5f 6f 70 74 5f 63 69 70  cipher, _opt_cip
76b0: 68 65 72 73 2c 0a 20 20 20 20 5f 6f 70 74 5f 63  hers,.    _opt_c
76c0: 69 70 68 65 72 73 75 69 74 65 2c 20 5f 6f 70 74  iphersuite, _opt
76d0: 5f 63 6d 64 2c 20 5f 6f 70 74 5f 64 68 70 61 72  _cmd, _opt_dhpar
76e0: 61 6d 73 2c 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f  ams, _opt_key, _
76f0: 6f 70 74 5f 6b 65 79 66 69 6c 65 2c 20 5f 6f 70  opt_keyfile, _op
7700: 74 5f 6d 6f 64 65 6c 2c 20 5f 6f 70 74 5f 70 61  t_model, _opt_pa
7710: 73 73 77 6f 72 64 2c 0a 20 20 20 20 5f 6f 70 74  ssword,.    _opt
7720: 5f 68 61 6e 64 73 68 61 6b 65 2c 20 5f 6f 70 74  _handshake, _opt
7730: 5f 72 65 71 75 65 73 74 2c 20 5f 6f 70 74 5f 72  _request, _opt_r
7740: 65 71 75 69 72 65 2c 20 5f 6f 70 74 5f 73 65 63  equire, _opt_sec
7750: 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 5f 6f 70  urity_level, _op
7760: 74 5f 73 65 72 76 65 72 2c 20 5f 6f 70 74 5f 73  t_server, _opt_s
7770: 65 72 76 65 72 6e 61 6d 65 2c 0a 20 20 20 20 5f  ervername,.    _
7780: 6f 70 74 5f 73 65 73 73 69 6f 6e 5f 69 64 2c 20  opt_session_id, 
7790: 5f 6f 70 74 5f 73 73 6c 32 2c 20 5f 6f 70 74 5f  _opt_ssl2, _opt_
77a0: 73 73 6c 33 2c 20 5f 6f 70 74 5f 74 6c 73 31 2c  ssl3, _opt_tls1,
77b0: 20 5f 6f 70 74 5f 74 6c 73 31 31 2c 20 5f 6f 70   _opt_tls11, _op
77c0: 74 5f 74 6c 73 31 32 2c 20 5f 6f 70 74 5f 74 6c  t_tls12, _opt_tl
77d0: 73 31 33 2c 0a 20 20 20 20 5f 6f 70 74 5f 76 61  s13,.    _opt_va
77e0: 6c 69 64 61 74 65 2c 20 5f 6f 70 74 5f 76 63 6d  lidate, _opt_vcm
77f0: 64 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  d.};../*. *-----
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20  --------------. 
7840: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  *. * ImportObjCm
7850: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
7860: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
7870: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
7880: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e  the "ssl" comman
7890: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20  d. *. *.The ssl 
78a0: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53  command pushes S
78b0: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79  SL over a (newly
78c0: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20   connected) tcp 
78d0: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73  socket. *. * Res
78e0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
78f0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
7900: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
7910: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
7920: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
7930: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
7940: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
7950: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74  ---------. */.st
7990: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f  atic int.ImportO
79a0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
79b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
79c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
79d0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
79e0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
79f0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
7a00: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
7a10: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
7a20: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
7a30: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
7a40: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
7a50: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
7a60: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
7a70: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20  TX *ctx.        
7a80: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
7a90: 4f 62 6a 20 2a 63 6d 64 4f 62 6a 09 20 20 20 20  Obj *cmdObj.    
7aa0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
7ab0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 64 4f  Tcl_Obj *passwdO
7ac0: 62 6a 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  bj.        = NUL
7ad0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
7ae0: 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e  vcmd.        = N
7af0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
7b00: 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65  ring upperChanne
7b10: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70  lTranslation, up
7b20: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
7b30: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ng, upperChannel
7b40: 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43  Encoding, upperC
7b50: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20  hannelEOFChar;. 
7b60: 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20     int idx;.    
7b70: 54 63 6c 5f 53 69 7a 65 20 66 6e 2c 20 6c 65 6e  Tcl_Size fn, len
7b80: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09  ;.    int flags.
7b90: 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54  .        = TLS_T
7ba0: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
7bb0: 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20 20   server..       
7bc0: 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e   = 0;./* is conn
7bd0: 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20  ection incoming 
7be0: 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a  or outgoing? */.
7bf0: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c      char *keyfil
7c00: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
7c10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74  ;.    char *cert
7c20: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
7c30: 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ULL;.    unsigne
7c40: 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20  d char *key  .= 
7c50: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
7c60: 7a 65 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20  ze key_len      
7c70: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
7c80: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7c90: 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 20  r *cert         
7ca0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
7cb0: 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 20 20 20  Size cert_len   
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30               = 0
7cd0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
7ce0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
7cf0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69  LL;.    char *ci
7d00: 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20  phersuites.     
7d10: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
7d20: 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20  har *CAfile.    
7d30: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
7d40: 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20  char *CAdir..   
7d50: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
7d60: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09   char *DHparams.
7d70: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7d80: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09      char *model.
7d90: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7da0: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
7db0: 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20  rname.        = 
7dc0: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d  NULL;./* hostnam
7dd0: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d  e for Server Nam
7de0: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a  e Indication */.
7df0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
7e00: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
7e10: 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  _id = NULL;.    
7e20: 54 63 6c 5f 53 69 7a 65 20 73 65 73 73 5f 6c 65  Tcl_Size sess_le
7e30: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
7e40: 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 4f 62   = 0;.    Tcl_Ob
7e50: 6a 20 2a 61 6c 70 6e 4f 62 6a 09 09 3d 20 4e 55  j *alpnObj..= NU
7e60: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32  LL;.    int ssl2
7e70: 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a   = 0, ssl3 = 0;.
7e80: 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31      int tls1 = 1
7e90: 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c  , tls1_1 = 1, tl
7ea0: 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33  s1_2 = 1, tls1_3
7eb0: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72   = 1;.    int pr
7ec0: 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d  oto = 0, level =
7ed0: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72   -1;.    int ver
7ee0: 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65  ify = 0, require
7ef0: 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20   = 0, request = 
7f00: 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  1, post_handshak
7f10: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  e = 0;..    dpri
7f20: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
7f30: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7f40: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
7f50: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
7f60: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23  .    tls1 = 0;.#
7f70: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
7f80: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
7f90: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7fa0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74  NO_TLS1_1).    t
7fb0: 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_1 = 0;.#endi
7fc0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
7fd0: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
7fe0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7ff0: 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_2).    tls1_
8000: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 0;.#endif.#i
8010: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
8020: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
8030: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8040: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20  3).    tls1_3 = 
8050: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  0;.#endif..    i
8060: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
8070: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8080: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
8090: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69  , "channel ?opti
80a0: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ons?");..return 
80b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
80c0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
80d0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
80e0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
80f0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
8100: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8110: 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53  (objv[1], (Tcl_S
8120: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55  ize *) NULL), NU
8130: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
8140: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
8150: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
8160: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8170: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
8180: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
8190: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
81a0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
81b0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
81c0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
81d0: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32      for (idx = 2
81e0: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
81f0: 78 2b 2b 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f  x++) {..if (Tcl_
8200: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
8210: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78  interp, objv[idx
8220: 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 2c  ], command_opts,
8230: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 66   "option", 0, &f
8240: 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  n) != TCL_OK) {.
8250: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8260: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 56  ERROR;..}.../* V
8270: 61 6c 69 64 61 74 65 20 61 72 67 20 68 61 73 20  alidate arg has 
8280: 76 61 6c 75 65 20 2a 2f 0a 09 69 66 20 28 2b 2b  value */..if (++
8290: 69 64 78 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09  idx >= objc) {..
82a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
82b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f  sult(interp, "No
82c0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f   value for optio
82d0: 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  n \"", command_o
82e0: 70 74 73 5b 66 6e 5d 2c 20 22 5c 22 22 2c 20 28  pts[fn], "\"", (
82f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8300: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8310: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  RROR;..}...switc
8320: 68 28 66 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f  h(fn) {..case _o
8330: 70 74 5f 61 6c 70 6e 3a 0a 09 20 20 20 20 61 6c  pt_alpn:..    al
8340: 70 6e 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78  pnObj = objv[idx
8350: 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ];..    break;..
8360: 63 61 73 65 20 5f 6f 70 74 5f 63 61 64 69 72 3a  case _opt_cadir:
8370: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
8380: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
8390: 43 41 64 69 72 2c 20 4e 55 4c 4c 29 3b 0a 09 20  CAdir, NULL);.. 
83a0: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
83b0: 5f 6f 70 74 5f 63 61 66 69 6c 65 3a 0a 09 20 20  _opt_cafile:..  
83c0: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
83d0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 66 69  (objv[idx], CAfi
83e0: 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  le, NULL);..    
83f0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8400: 74 5f 63 65 72 74 3a 0a 09 20 20 20 20 47 45 54  t_cert:..    GET
8410: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28  _OPT_BYTE_ARRAY(
8420: 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 65 72 74 2c  objv[idx], cert,
8430: 20 26 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 20 20   &cert_len);..  
8440: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8450: 6f 70 74 5f 63 65 72 74 66 69 6c 65 3a 0a 09 20  opt_certfile:.. 
8460: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
8470: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 65 72  G(objv[idx], cer
8480: 74 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20  tfile, NULL);.. 
8490: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
84a0: 5f 6f 70 74 5f 63 69 70 68 65 72 3a 0a 09 63 61  _opt_cipher:..ca
84b0: 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 3a  se _opt_ciphers:
84c0: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
84d0: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
84e0: 63 69 70 68 65 72 73 2c 20 4e 55 4c 4c 29 3b 0a  ciphers, NULL);.
84f0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8500: 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 75 69  e _opt_ciphersui
8510: 74 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  te:..    GET_OPT
8520: 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78  _STRING(objv[idx
8530: 5d 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c  ], ciphersuites,
8540: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
8550: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  ak;..case _opt_c
8560: 6d 64 3a 0a 09 20 20 20 20 63 6d 64 4f 62 6a 20  md:..    cmdObj 
8570: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
8580: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8590: 6f 70 74 5f 64 68 70 61 72 61 6d 73 3a 0a 09 20  opt_dhparams:.. 
85a0: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
85b0: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 44 48 70  G(objv[idx], DHp
85c0: 61 72 61 6d 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20  arams, NULL);.. 
85d0: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
85e0: 5f 6f 70 74 5f 6b 65 79 3a 0a 09 20 20 20 20 47  _opt_key:..    G
85f0: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41  ET_OPT_BYTE_ARRA
8600: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6b 65 79  Y(objv[idx], key
8610: 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 20 20  , &key_len);..  
8620: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8630: 6f 70 74 5f 6b 65 79 66 69 6c 65 3a 0a 09 20 20  opt_keyfile:..  
8640: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
8650: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6b 65 79 66  (objv[idx], keyf
8660: 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ile, NULL);..   
8670: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8680: 70 74 5f 6d 6f 64 65 6c 3a 0a 09 20 20 20 20 47  pt_model:..    G
8690: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
86a0: 6a 76 5b 69 64 78 5d 2c 20 6d 6f 64 65 6c 2c 20  jv[idx], model, 
86b0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
86c0: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61  k;..case _opt_pa
86d0: 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 70 61 73  ssword:..    pas
86e0: 73 77 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64  swdObj = objv[id
86f0: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  x];..    break;.
8700: 09 63 61 73 65 20 5f 6f 70 74 5f 68 61 6e 64 73  .case _opt_hands
8710: 68 61 6b 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f  hake:..    GET_O
8720: 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78  PT_BOOL(objv[idx
8730: 5d 2c 20 26 70 6f 73 74 5f 68 61 6e 64 73 68 61  ], &post_handsha
8740: 6b 65 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  ke);..    break;
8750: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72 65 71 75  ..case _opt_requ
8760: 65 73 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  est:..    GET_OP
8770: 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d  T_BOOL(objv[idx]
8780: 2c 20 26 72 65 71 75 65 73 74 29 3b 0a 09 20 20  , &request);..  
8790: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
87a0: 6f 70 74 5f 72 65 71 75 69 72 65 3a 0a 09 20 20  opt_require:..  
87b0: 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f    GET_OPT_BOOL(o
87c0: 62 6a 76 5b 69 64 78 5d 2c 20 26 72 65 71 75 69  bjv[idx], &requi
87d0: 72 65 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  re);..    break;
87e0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65 63 75  ..case _opt_secu
87f0: 72 69 74 79 5f 6c 65 76 65 6c 3a 0a 09 20 20 20  rity_level:..   
8800: 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a   GET_OPT_INT(obj
8810: 76 5b 69 64 78 5d 2c 20 26 6c 65 76 65 6c 29 3b  v[idx], &level);
8820: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8830: 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72 3a 0a  se _opt_server:.
8840: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f  .    GET_OPT_BOO
8850: 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 73 65  L(objv[idx], &se
8860: 72 76 65 72 29 3b 0a 09 20 20 20 20 62 72 65 61  rver);..    brea
8870: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65  k;..case _opt_se
8880: 72 76 65 72 6e 61 6d 65 3a 0a 09 20 20 20 20 47  rvername:..    G
8890: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
88a0: 6a 76 5b 69 64 78 5d 2c 20 73 65 72 76 65 72 6e  jv[idx], servern
88b0: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ame, NULL);..   
88c0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
88d0: 70 74 5f 73 65 73 73 69 6f 6e 5f 69 64 3a 0a 09  pt_session_id:..
88e0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45      GET_OPT_BYTE
88f0: 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d  _ARRAY(objv[idx]
8900: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 26 73  , session_id, &s
8910: 65 73 73 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62  ess_len);..    b
8920: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8930: 5f 73 73 6c 32 3a 0a 09 20 20 20 20 47 45 54 5f  _ssl2:..    GET_
8940: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
8950: 5d 2c 20 26 73 73 6c 32 29 3b 0a 09 20 20 20 20  ], &ssl2);..    
8960: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8970: 74 5f 73 73 6c 33 3a 0a 09 20 20 20 20 47 45 54  t_ssl3:..    GET
8980: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
8990: 78 5d 2c 20 26 73 73 6c 33 29 3b 0a 09 20 20 20  x], &ssl3);..   
89a0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
89b0: 70 74 5f 74 6c 73 31 3a 0a 09 20 20 20 20 47 45  pt_tls1:..    GE
89c0: 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69  T_OPT_INT(objv[i
89d0: 64 78 5d 2c 20 26 74 6c 73 31 29 3b 0a 09 20 20  dx], &tls1);..  
89e0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
89f0: 6f 70 74 5f 74 6c 73 31 31 3a 0a 09 20 20 20 20  opt_tls11:..    
8a00: 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76  GET_OPT_INT(objv
8a10: 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f 31 29 3b  [idx], &tls1_1);
8a20: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8a30: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 32 3a 0a 09  se _opt_tls12:..
8a40: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
8a50: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31  objv[idx], &tls1
8a60: 5f 32 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  _2);..    break;
8a70: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31  ..case _opt_tls1
8a80: 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  3:..    GET_OPT_
8a90: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8aa0: 74 6c 73 31 5f 33 29 3b 0a 09 20 20 20 20 62 72  tls1_3);..    br
8ab0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8ac0: 76 61 6c 69 64 61 74 65 3a 0a 09 63 61 73 65 20  validate:..case 
8ad0: 5f 6f 70 74 5f 76 63 6d 64 3a 0a 09 20 20 20 20  _opt_vcmd:..    
8ae0: 76 63 6d 64 20 3d 20 6f 62 6a 76 5b 69 64 78 5d  vcmd = objv[idx]
8af0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
8b00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
8b10: 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79  request)..verify
8b20: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
8b30: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
8b40: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
8b50: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
8b60: 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79   require).verify
8b70: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
8b80: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
8b90: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71  ERT;.    if (req
8ba0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
8bb0: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c  dshake).verify |
8bc0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  = SSL_VERIFY_POS
8bd0: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20  T_HANDSHAKE;.   
8be0: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30   if (verify == 0
8bf0: 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f  )..verify = SSL_
8c00: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20  VERIFY_NONE;..  
8c10: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32    proto |= (ssl2
8c20: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
8c30: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8c40: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53  o |= (ssl3 ? TLS
8c50: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29  _PROTO_SSL3 : 0)
8c60: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
8c70: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  tls1 ? TLS_PROTO
8c80: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20  _TLS1 : 0);.    
8c90: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31  proto |= (tls1_1
8ca0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8cb0: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_1 : 0);.    pr
8cc0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f  oto |= (tls1_2 ?
8cd0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
8ce0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8cf0: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54  o |= (tls1_3 ? T
8d00: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20  LS_PROTO_TLS1_3 
8d10: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  : 0);..    /* re
8d20: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62  set to NULL if b
8d30: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76  lank string prov
8d40: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  ided */.    if (
8d50: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09  cert && !*cert).
8d60: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20  .        cert.  
8d70: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8d80: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b    if (key && !*k
8d90: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79  ey)..        key
8da0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8db0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
8dc0: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29  e && !*certfile)
8dd0: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c           certfil
8de0: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  e.= NULL;.    if
8df0: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b   (keyfile && !*k
8e00: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65  eyfile)..keyfile
8e10: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8e20: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
8e30: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20   && !*ciphers). 
8e40: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20         ciphers. 
8e50: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
8e60: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69     if (ciphersui
8e70: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73  tes && !*ciphers
8e80: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69  uites) ciphersui
8e90: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20  tes    = NULL;. 
8ea0: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26     if (CAfile &&
8eb0: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20   !*CAfile).     
8ec0: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20     CAfile.      
8ed0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
8ee0: 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 64   (CAdir && !*CAd
8ef0: 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 69  ir).        CAdi
8f00: 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  r.        = NULL
8f10: 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  ;.    if (DHpara
8f20: 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73  ms && !*DHparams
8f30: 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61  ).        DHpara
8f40: 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  ms        = NULL
8f50: 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53  ;..    /* new SS
8f60: 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73  L state */.    s
8f70: 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74  tatePtr..= (Stat
8f80: 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e  e *) ckalloc((un
8f90: 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53  signed) sizeof(S
8fa0: 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73  tate));.    mems
8fb0: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20  et(statePtr, 0, 
8fc0: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
8fd0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
8fe0: 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20  lags.= flags;.  
8ff0: 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65    statePtr->inte
9000: 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp.= interp;.   
9010: 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67   statePtr->vflag
9020: 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20  s.= verify;.    
9030: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20  statePtr->err.= 
9040: 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f  "";..    /* allo
9050: 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20  cate script */. 
9060: 20 20 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d     if (cmdObj !=
9070: 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29   NULL) {..(void)
9080: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9090: 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 26 6c  omObj(cmdObj, &l
90a0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
90b0: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
90c0: 63 61 6c 6c 62 61 63 6b 20 3d 20 63 6d 64 4f 62  callback = cmdOb
90d0: 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  j;..    Tcl_Incr
90e0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
90f0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d  r->callback);..}
9100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
9110: 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64  llocate password
9120: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73   */.    if (pass
9130: 77 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  wdObj != NULL) {
9140: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
9150: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61  StringFromObj(pa
9160: 73 73 77 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a  sswdObj, &len);.
9170: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
9180: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77   statePtr->passw
9190: 6f 72 64 20 3d 20 70 61 73 73 77 64 4f 62 6a 3b  ord = passwdObj;
91a0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
91b0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
91c0: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20  >password);..}. 
91d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
91e0: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63  ocate validate c
91f0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66  ommand */.    if
9200: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64   (vcmd) {..(void
9210: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
9220: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65  romObj(vcmd, &le
9230: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
9240: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
9250: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20  cmd = vcmd;..   
9260: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
9270: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  t(statePtr->vcmd
9280: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
9290: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55   if (model != NU
92a0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b  LL) {..int mode;
92b0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f  ../* Get the "mo
92c0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  del" context */.
92d0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43  .chan = Tcl_GetC
92e0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d  hannel(interp, m
92f0: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69  odel, &mode);..i
9300: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
9310: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9320: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
9330: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
9340: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
9350: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
9360: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  *.. * Make sure 
9370: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
9380: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
9390: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  l.. */..chan = T
93a0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
93b0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c  (chan);..if (Tcl
93c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
93d0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
93e0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20  nnelType()) {.. 
93f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9400: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
9410: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
9420: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
9430: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
9440: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
9450: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  ", NULL);..    T
9460: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
9470: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
9480: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45  IMPORT", "CHANNE
9490: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
94a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
94b0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
94c0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
94d0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
94e0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20  _ERROR;..}..ctx 
94f0: 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f  = ((State *)Tcl_
9500: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
9510: 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63  ceData(chan))->c
9520: 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  tx;.    } else {
9530: 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58  ..if ((ctx = CTX
9540: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20  _Init(statePtr, 
9550: 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b  server, proto, k
9560: 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65  eyfile, certfile
9570: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 28 69 6e  , key, cert, (in
9580: 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20  t) key_len,..   
9590: 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65 6e 2c   (int) cert_len,
95a0: 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20   CAdir, CAfile, 
95b0: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73  ciphers, ciphers
95c0: 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48  uites, level, DH
95d0: 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c  params)) == NULL
95e0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
95f0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
9600: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
9610: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
9620: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65      }..    state
9630: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a  Ptr->ctx = ctx;.
9640: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
9650: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
9660: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
9670: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69  nnel works in bi
9680: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20  nary (for the.  
9690: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20     * encryption 
96a0: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
96b0: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65  d up)..     * We
96c0: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64   only want to ad
96d0: 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69  just the bufferi
96e0: 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61  ng in pre-v2 cha
96f0: 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20  nnels, where.   
9700: 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c    * each channel
9710: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61   in the stack ma
9720: 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e  intained its own
9730: 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a   buffers..     *
9740: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
9750: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
9760: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
9770: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9780: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
9790: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
97a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
97b0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
97c0: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
97d0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
97e0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
97f0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
9800: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9810: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
9820: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
9830: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
9840: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
9850: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9860: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  han, "-encoding"
9870: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
9880: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
9890: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
98a0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
98b0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
98c0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72   &upperChannelTr
98d0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
98e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
98f0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
9900: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
9910: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
9920: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
9930: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9940: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9950: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
9960: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63  binary");.    Tc
9970: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
9980: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
9990: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74   "-blocking", "t
99a0: 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e  rue");.    dprin
99b0: 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63  tf("Consuming Tc
99c0: 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54  l channel %s", T
99d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
99e0: 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74  e(chan));.    st
99f0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54  atePtr->self = T
9a00: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28  cl_StackChannel(
9a10: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e  interp, Tls_Chan
9a20: 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65  nelType(), (Clie
9a30: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
9a40: 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20  , (TCL_READABLE 
9a50: 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c  | TCL_WRITABLE),
9a60: 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69   chan);.    dpri
9a70: 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61  ntf("Created cha
9a80: 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20  nnel named %s", 
9a90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
9aa0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
9ab0: 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61  f));.    if (sta
9ac0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28  tePtr->self == (
9ad0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
9ae0: 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20  L) {../*.. * No 
9af0: 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74  use of Tcl_Event
9b00: 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73  uallyFree becaus
9b10: 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63  e no possible Tc
9b20: 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f  l_Preserve... */
9b30: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72  ..Tls_Free((char
9b40: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
9b50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9b60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
9b70: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
9b80: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
9b90: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e  tr->self, "-tran
9ba0: 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53  slation", Tcl_DS
9bb0: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
9bc0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
9bd0: 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ion));.    Tcl_S
9be0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9bf0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
9c00: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69  ->self, "-encodi
9c10: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
9c20: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
9c30: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20  nelEncoding));. 
9c40: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
9c50: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9c60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
9c70: 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f  "-eofchar", Tcl_
9c80: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
9c90: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
9ca0: 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  r));.    Tcl_Set
9cb0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9cc0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9cd0: 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  self, "-blocking
9ce0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
9cf0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
9d00: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20  lBlocking));..  
9d10: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
9d20: 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  Initialization. 
9d30: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65      */.    state
9d40: 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e  Ptr->ssl = SSL_n
9d50: 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ew(statePtr->ctx
9d60: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74  );.    if (!stat
9d70: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a  ePtr->ssl) {../*
9d80: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72   SSL library err
9d90: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e  or */..Tcl_Appen
9da0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9db0: 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72  "couldn't constr
9dc0: 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a  uct ssl session:
9dd0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63   ", REASON(), (c
9de0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
9df0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
9e00: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
9e10: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e  ", "IMPORT", "IN
9e20: 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  IT", "FAILED", (
9e30: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
9e40: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
9e50: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
9e60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9e70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
9e80: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61  t host server na
9e90: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  me */.    if (se
9ea0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20  rvername) {../* 
9eb0: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20  Sets the server 
9ec0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
9ed0: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48  (SNI) in ClientH
9ee0: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ello extension *
9ef0: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30  /../* Per RFC 60
9f00: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  66, hostname is 
9f10: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20  a ASCII encoded 
9f20: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52  string, though R
9f30: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46  FC 4366 says UTF
9f40: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  -8. */..if (!SSL
9f50: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
9f60: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
9f70: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
9f80: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
9f90: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9fa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65  sult(interp, "se
9fb0: 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e  tting TLS host n
9fc0: 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61  ame extension fa
9fd0: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  iled", (char *) 
9fe0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
9ff0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
a000: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
a010: 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41  ORT", "SNI", "FA
a020: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
a030: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
a040: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a050: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a060: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a070: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74  .}.../* Set host
a080: 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65  name for peer ce
a090: 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61  rtificate hostna
a0a0: 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  me verification 
a0b0: 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20  in clients...   
a0c0: 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65  Don't use SSL_se
a0d0: 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74  t1_host since it
a0e0: 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73   has limitations
a0f0: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61  . */..if (!SSL_a
a100: 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74  dd1_host(statePt
a110: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
a120: 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  me)) {..    Tcl_
a130: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a140: 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 44 4e  erp, "setting DN
a150: 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c  S host name fail
a160: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
a170: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
a180: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
a190: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
a1a0: 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20  T", "HOSTNAME", 
a1b0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
a1c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a1d0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
a1e0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
a1f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a200: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
a210: 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69   /* Resume sessi
a220: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20  on id */.    if 
a230: 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73  (session_id && s
a240: 65 73 73 5f 6c 65 6e 20 3c 3d 20 53 53 4c 5f 4d  ess_len <= SSL_M
a250: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54  AX_SID_CTX_LENGT
a260: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  H) {../* SSL_set
a270: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69  _session() */..i
a280: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  f (!SSL_SESSION_
a290: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28  set1_id_context(
a2a0: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
a2b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
a2c0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73  session_id, (uns
a2d0: 69 67 6e 65 64 20 69 6e 74 29 20 73 65 73 73 5f  igned int) sess_
a2e0: 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  len)) {..    Tcl
a2f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a300: 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65  terp, "Resume se
a310: 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73  ssion id ", sess
a320: 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64  ion_id, " failed
a330: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a340: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
a350: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
a360: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
a370: 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41  , "SESSION", "FA
a380: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
a390: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
a3a0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a3b0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a3c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a3d0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a3e0: 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74   Enable Applicat
a3f0: 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63  ion-Layer Protoc
a400: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20  ol Negotiation. 
a410: 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74  Examples are: ht
a420: 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e  tp/1.0,..http/1.
a430: 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20  1, h2, h3, ftp, 
a440: 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70  imap, pop3, xmpp
a450: 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65  -client, xmpp-se
a460: 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c  rver, mqtt, irc,
a470: 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20   etc. */.    if 
a480: 28 61 6c 70 6e 4f 62 6a 20 21 3d 20 4e 55 4c 4c  (alpnObj != NULL
a490: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20  ) {../* Convert 
a4a0: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20  a TCL list into 
a4b0: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  a protocol-list 
a4c0: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a  in wire-format *
a4d0: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  /..unsigned char
a4e0: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75   *protos, *p;..u
a4f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74  nsigned int prot
a500: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c  os_len = 0;..Tcl
a510: 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69  _Size cnt, i;..i
a520: 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  nt j;..Tcl_Obj *
a530: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c  *list;...if (Tcl
a540: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
a550: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e  nts(interp, alpn
a560: 4f 62 6a 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  Obj, &cnt, &list
a570: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
a580: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a590: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a5a0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a5b0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
a5c0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
a5d0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
a5e0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
a5f0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
a600: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
a610: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
a620: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
a630: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
a640: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
a650: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
a660: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a670: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
a680: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63  me too long", (c
a690: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
a6a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
a6b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
a6c0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
a6d0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
a6e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c  r *) NULL);...Tl
a6f0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
a700: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
a710: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a720: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
a730: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e  s_len += 1 + (in
a740: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20  t) len;..}.../* 
a750: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65  Build the comple
a760: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  te protocol-list
a770: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b   */..protos = ck
a780: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e  alloc(protos_len
a790: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d  );../* protocol-
a7a0: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66  lists consist of
a7b0: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72   8-bit length-pr
a7c0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72  efixed, byte str
a7d0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20  ings */..for (j 
a7e0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b  = 0, p = protos;
a7f0: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b   j < cnt; j++) {
a800: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20  ..    char *str 
a810: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
a820: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20  romObj(list[j], 
a830: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b  &len);..    *p++
a840: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
a850: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d  r) len;..    mem
a860: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a  cpy(p, str, (siz
a870: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
a880: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  p += len;..}.../
a890: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70  * SSL_set_alpn_p
a8a0: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f  rotos makes a co
a8b0: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63  py of the protoc
a8c0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e  ol-list */../* N
a8d0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ote: This functi
a8e0: 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65  ons reverses the
a8f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f   return value co
a900: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  nvention */..if 
a910: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72  (SSL_set_alpn_pr
a920: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73  otos(statePtr->s
a930: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74  sl, protos, prot
a940: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20  os_len)) {..    
a950: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a960: 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64  (interp, "failed
a970: 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72 6f   to set ALPN pro
a980: 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a  tocols", (char *
a990: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
a9a0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
a9b0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
a9c0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20  MPORT", "ALPN", 
a9d0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
a9e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a9f0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
aa00: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
aa10: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b   ckfree(protos);
aa20: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
aa30: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
aa40: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20  Store protocols 
aa50: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  list */..statePt
aa60: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74  r->protos = prot
aa70: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  os;..statePtr->p
aa80: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74  rotos_len = prot
aa90: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
aaa0: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  se {..statePtr->
aab0: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09  protos = NULL;..
aac0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
aad0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  _len = 0;.    }.
aae0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
aaf0: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20  SL Callbacks.   
ab00: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74    */.    SSL_set
ab10: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50  _app_data(stateP
ab20: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
ab30: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70  )statePtr);./* p
ab40: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20  oint back to us 
ab50: 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  */..    SSL_set_
ab60: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
ab70: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
ab80: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
ab90: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
aba0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
abb0: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
abc0: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
abd0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
abe0: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
abf0: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
ac00: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
ac10: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
ac20: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
ac30: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
ac40: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
ac50: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
ac60: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
ac70: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
ac80: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
ac90: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
aca0: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
acb0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
acc0: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
acd0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
ace0: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
acf0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
ad00: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
ad10: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
ad20: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
ad30: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
ad40: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
ad50: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
ad60: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
ad70: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
ad80: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
ad90: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
ada0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
adb0: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
adc0: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
add0: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
ade0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
adf0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
ae00: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
ae10: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
ae20: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
ae30: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
ae40: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
ae50: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
ae60: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
ae70: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
ae80: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
ae90: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
aea0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
aeb0: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
aec0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
aed0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
aee0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
aef0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
af00: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
af10: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
af20: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
af30: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
af40: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
af50: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
af60: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
af70: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
af80: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
af90: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
afa0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
afb0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
afc0: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
afd0: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
afe0: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
aff0: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
b000: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
b010: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
b020: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
b030: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
b040: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
b050: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
b060: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
b070: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
b080: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
b090: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
b0a0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
b0b0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26  post_handshake &
b0c0: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20  & tls1_3) {..   
b0d0: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
b0e0: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
b0f0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
b100: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75  ;..}.../* set au
b110: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65  tomatic curve se
b120: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  lection */..SSL_
b130: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74  set_ecdh_auto(st
b140: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
b150: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
b160: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
b170: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
b180: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
b190: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
b1a0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
b1b0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
b1c0: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
b1d0: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
b1e0: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
b1f0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
b200: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
b210: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
b220: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
b230: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
b240: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
b250: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
b260: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
b270: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
b280: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
b290: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
b2a0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
b2b0: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
b2c0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
b2d0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
b2e0: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
b2f0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
b300: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
b310: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
b320: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
b330: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
b340: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
b350: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
b360: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
b370: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
b380: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
b390: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
b3a0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
b3b0: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
b3c0: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
b3d0: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
b3e0: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
b3f0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
b400: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
b410: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
b420: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
b430: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
b440: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
b450: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
b460: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
b470: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
b480: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
b490: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
b4a0: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
b4b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
b4c0: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
b4d0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
b4e0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
b4f0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
b500: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
b510: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
b520: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b530: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
b540: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
b550: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54  atePtr->self), T
b560: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20  CL_VOLATILE);.. 
b570: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b580: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
b590: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
b5a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
b5b0: 2d 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 0a 20 2a 0a 20 2a 20 55  --------. *. * U
b5f0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d  nimportObjCmd --
b600: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
b610: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
b620: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
b630: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66  opmost channel f
b640: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  ilter.. *. * Res
b650: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
b660: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
b670: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
b680: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
b690: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
b6a0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
b6b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
b6c0: 2d 2d 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 0a 20 2a 2f 0a 73 74  ---------. */.st
b700: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72  atic int.Unimpor
b710: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
b720: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
b730: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b740: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
b750: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
b760: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
b770: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
b780: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
b790: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
b7a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
b7b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
b7c0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
b7d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b7e0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
b7f0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
b800: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
b820: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
b830: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
b840: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
b850: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
b860: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
b870: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
b880: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b8a0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
b8b0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
b8c0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
b8d0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
b8e0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
b8f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  );..    if (Tcl_
b900: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
b910: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
b920: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
b930: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b940: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
b950: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
b960: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
b970: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
b980: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
b990: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b9a0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b9b0: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50  p, "TLS", "UNIMP
b9c0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
b9d0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
b9e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
b9f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ba00: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
ba10: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c  l_UnstackChannel
ba20: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d  (interp, chan) =
ba30: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
ba40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ba50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
ba60: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
ba70: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
ba80: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
ba90: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69  --. *. * CTX_Ini
bae0: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61  t -- construct a
baf0: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63   SSL_CTX instanc
bb00: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  e. *. * Results:
bb10: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f  . *.A valid SSL_
bb20: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20  CTX instance or 
bb30: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  NULL.. *. * Side
bb40: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e   effects:. *.con
bb50: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74  structs SSL cont
bb60: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
bb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53  --. */.static SS
bbc0: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74  L_CTX *.CTX_Init
bbd0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
bbe0: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20  , int isServer, 
bbf0: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20  int proto, char 
bc00: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a  *keyfile, char *
bc10: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e  certfile,.    un
bc20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
bc30: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
bc40: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c  *cert, int key_l
bc50: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e  en, int cert_len
bc60: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20  , char *CAdir,. 
bc70: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c     char *CAfile,
bc80: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20   char *ciphers, 
bc90: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
bca0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
bcb0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b  har *DHparams) {
bcc0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
bcd0: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50  *interp = stateP
bce0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
bcf0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  SSL_CTX *ctx = N
bd00: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
bd10: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c  ring ds;.    Tcl
bd20: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20  _DString ds1;.  
bd30: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20    int off = 0;. 
bd40: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
bd50: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
bd60: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
bd70: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
bd80: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
bd90: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
bda0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
bdb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
bdc0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
bdd0: 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20  elected", (char 
bde0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
bdf0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
be00: 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c     /* create SSL
be10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20   context */.#if 
be20: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
be30: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
be40: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
be50: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
be60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
be70: 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL2).    if (EN
be80: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
be90: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a  _PROTO_SSL2)) {.
bea0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
beb0: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20  t(interp, "SSL2 
bec0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
bed0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
bee0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
bef0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
bf00: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
bf10: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
bf20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
bf30: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL3).    if (ENA
bf40: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
bf50: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09  PROTO_SSL3)) {..
bf60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bf70: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70  (interp, "SSL3 p
bf80: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
bf90: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
bfa0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
bfb0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
bfc0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
bfd0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
bfe0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
bff0: 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  S1).    if (ENAB
c000: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
c010: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54  ROTO_TLS1)) {..T
c020: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c030: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30  interp, "TLS 1.0
c040: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c050: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c060: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c070: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c080: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
c090: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
c0a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c0b0: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66  O_TLS1_1).    if
c0c0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
c0d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
c0e0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
c0f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c100: 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f  "TLS 1.1 protoco
c110: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
c120: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c130: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
c140: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
c150: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
c160: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
c170: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
c180: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
c190: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
c1a0: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54  TO_TLS1_2)) {..T
c1b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c1c0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32  interp, "TLS 1.2
c1d0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c1e0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c1f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c200: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c210: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
c220: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
c230: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c240: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
c250: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
c260: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
c270: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  3)) {..Tcl_Appen
c280: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c290: 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f  "TLS 1.3 protoco
c2a0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
c2b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c2c0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
c2d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
c2e0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29   if (proto == 0)
c2f0: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20   {../* Use full 
c300: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54  range */..SSL_CT
c310: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
c320: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
c330: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
c340: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
c350: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ctx, 0);.    }..
c360: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
c370: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  o) {.#if OPENSSL
c380: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
c390: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
c3a0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
c3b0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
c3c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
c3d0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
c3e0: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64  TO_SSL2:..method
c3f0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
c400: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv2_server_metho
c410: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65  d() : SSLv2_clie
c420: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
c430: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
c440: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
c450: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c460: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
c470: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
c480: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
c490: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
c4a0: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
c4b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
c4c0: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65   SSLv3_server_me
c4d0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63  thod() : SSLv3_c
c4e0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
c4f0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
c500: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
c510: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
c520: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c530: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c540: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
c550: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
c560: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
c570: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
c580: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72  r ? TLSv1_server
c590: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
c5a0: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
c5b0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
c5c0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
c5d0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
c5e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c5f0: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
c600: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c610: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
c620: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
c630: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f  O_TLS1_1:..metho
c640: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
c650: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65  LSv1_1_server_me
c660: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31  thod() : TLSv1_1
c670: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
c680: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
c690: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
c6a0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
c6b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c6c0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
c6d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
c6e0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
c6f0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
c700: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
c710: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
c720: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_2_server_met
c730: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f  hod() : TLSv1_2_
c740: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
c750: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
c760: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
c770: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
c780: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
c790: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
c7a0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
c7b0: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65  :../* Use the ge
c7c0: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64  neric method and
c7d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67   constraint rang
c7e0: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20  e after context 
c7f0: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d  is created */..m
c800: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
c810: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
c820: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
c830: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
c840: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
c850: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65   default:../* Ne
c860: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20  gotiate highest 
c870: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c  available SSL/TL
c880: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65  S version */..me
c890: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
c8a0: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
c8b0: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
c8c0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  nt_method();.#if
c8d0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
c8e0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
c8f0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
c900: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
c910: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c920: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
c930: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
c940: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
c950: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
c960: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
c970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
c980: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
c990: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
c9a0: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
c9b0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
c9c0: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
c9d0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
c9e0: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
c9f0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
ca00: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
ca10: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
ca20: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
ca30: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
ca40: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
ca50: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
ca60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
ca70: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
ca80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
ca90: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
caa0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
cab0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cac0: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
cad0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
cae0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
caf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
cb00: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
cb10: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
cb20: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
cb30: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
cb40: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
cb50: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
cb60: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
cb70: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
cb80: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
cb90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
cba0: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
cbb0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
cbc0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
cbd0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
cbe0: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
cbf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
cc00: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
cc10: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20  r();..    ctx = 
cc20: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
cc30: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74  od);.    if (!ct
cc40: 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  x) {..return(NUL
cc50: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  L);.    }..    i
cc60: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59  f (getenv(SSLKEY
cc70: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c  LOGFILE)) {..SSL
cc80: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f  _CTX_set_keylog_
cc90: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65  callback(ctx, Ke
cca0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  yLogCallback);. 
ccb0: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
ccc0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
ccd0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
cce0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
ccf0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c   if (proto == TL
cd00: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
cd10: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  {..SSL_CTX_set_m
cd20: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
cd30: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
cd40: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  SION);..SSL_CTX_
cd50: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
cd60: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
cd70: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20  3_VERSION);.    
cd80: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
cd90: 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65   Force cipher se
cda0: 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79  lection order by
cdb0: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69   server */.    i
cdc0: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a  f (!isServer) {.
cdd0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74  .SSL_CTX_set_opt
cde0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
cdf0: 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50  _CIPHER_SERVER_P
ce00: 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20  REFERENCE);.    
ce10: 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
ce20: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
ce30: 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20  0x10100000L.    
ce40: 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f  OpenSSL_add_all_
ce50: 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a  algorithms(); /*
ce60: 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e   Load ciphers an
ce70: 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e  d digests */.#en
ce80: 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58  dif..    SSL_CTX
ce90: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74  _set_app_data(ct
cea0: 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70  x, (void*)interp
ceb0: 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74  );./* remember t
cec0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  he interpreter *
ced0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
cee0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
cef0: 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61  SL_OP_ALL);./* a
cf00: 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61  ll SSL bug worka
cf10: 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53  rounds */.    SS
cf20: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
cf30: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f  s(ctx, SSL_OP_NO
cf40: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f  _COMPRESSION);./
cf50: 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65  * disable compre
cf60: 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75  ssion even if su
cf70: 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53  pported */.    S
cf80: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
cf90: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f  ns(ctx, off);../
cfa0: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63  * disable protoc
cfb0: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23  ol versions */.#
cfc0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
cfd0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
cfe0: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f  101000L.    SSL_
cff0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78  CTX_set_mode(ctx
d000: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f  , SSL_MODE_AUTO_
d010: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c  RETRY);./* handl
d020: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73  e new handshakes
d030: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20   in background. 
d040: 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e  On by default in
d050: 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20   OpenSSL 1.1.1. 
d060: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53  */.#endif.    SS
d070: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63  L_CTX_sess_set_c
d080: 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31  ache_size(ctx, 1
d090: 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  28);..    /* Set
d0a0: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69   user defined ci
d0b0: 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75  phers, cipher su
d0c0: 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69  ites, and securi
d0d0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
d0e0: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20  if ((ciphers != 
d0f0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54  NULL) && !SSL_CT
d100: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73  X_set_cipher_lis
d110: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29  t(ctx, ciphers))
d120: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d130: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
d140: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64  t ciphers failed
d150: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
d160: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rs", (char *) NU
d170: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
d180: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
d190: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
d1a0: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74   if ((ciphersuit
d1b0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  es != NULL) && !
d1c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
d1d0: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69  ersuites(ctx, ci
d1e0: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09  phersuites)) {..
d1f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d200: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
d210: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c  pher suites fail
d220: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
d230: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
d240: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
d250: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
d260: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
d270: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72      /* Set secur
d280: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
d290: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20   if (level > -1 
d2a0: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a  && level < 6) {.
d2b0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75  ./* SSL_set_secu
d2c0: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53  rity_level */..S
d2d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72  SL_CTX_set_secur
d2e0: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c  ity_level(ctx, l
d2f0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  evel);.    }..  
d300: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61    /* set some ca
d310: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53  llbacks */.    S
d320: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
d330: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78  lt_passwd_cb(ctx
d340: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61  , PasswordCallba
d350: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ck);.    SSL_CTX
d360: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
d370: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28  swd_cb_userdata(
d380: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
d390: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
d3a0: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65  read a Diffie-He
d3b0: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73  llman parameters
d3c0: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68   file, or use th
d3d0: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a  e built-in one *
d3e0: 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  /.#ifdef OPENSSL
d3f0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44  _NO_DH.    if (D
d400: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
d410: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d420: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48  sult(interp, "DH
d430: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f   parameter suppo
d440: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rt not available
d450: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d460: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
d470: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
d480: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  ULL;.    }.#else
d490: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a  .    {..DH* dh;.
d4a0: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d  .if (DHparams !=
d4b0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49   NULL) {..    BI
d4c0: 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c  O *bio;..    Tcl
d4d0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
d4e0: 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49  );..    bio = BI
d4f0: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44  O_new_file(F2N(D
d500: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22  Hparams, &ds), "
d510: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62  r");..    if (!b
d520: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72  io) {...Tcl_DStr
d530: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
d540: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d550: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
d560: 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61  not find DH para
d570: 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63  meters file", (c
d580: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
d590: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
d5a0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
d5b0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64  ;..    }...    d
d5c0: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f  h = PEM_read_bio
d5d0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e  _DHparams(bio, N
d5e0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
d5f0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ;..    BIO_free(
d600: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  bio);..    Tcl_D
d610: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
d620: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b  ..    if (!dh) {
d630: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
d640: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
d650: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70  ld not read DH p
d660: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66  arameters from f
d670: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ile", (char *) N
d680: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
d690: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
d6a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
d6b0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
d6c0: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68  t_tmp_dh(ctx, dh
d6d0: 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28  );..    DH_free(
d6e0: 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a  dh);...} else {.
d6f0: 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c  .    /* Use well
d700: 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65   known DH parame
d710: 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62  ters that have b
d720: 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20  uilt-in support 
d730: 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20  in OpenSSL */.. 
d740: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
d750: 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c  set_dh_auto(ctx,
d760: 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70   1)) {...Tcl_App
d770: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d780: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61  , "Could not ena
d790: 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a  ble set DH auto:
d7a0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63   ", REASON(), (c
d7b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
d7c0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
d7d0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
d7e0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
d7f0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
d800: 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69   set our certifi
d810: 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64  cate */.    load
d820: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30  _private_key = 0
d830: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69  ;.    if (certfi
d840: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c  le != NULL) {..l
d850: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
d860: 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69  = 1;...Tcl_DStri
d870: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69  ngInit(&ds);...i
d880: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
d890: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
d8a0: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c  ctx, F2N(certfil
d8b0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c  e, &ds), SSL_FIL
d8c0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
d8d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
d8e0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
d8f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d900: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
d910: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
d920: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
d930: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
d940: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c  ..     REASON(),
d950: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d960: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
d970: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
d980: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  turn NULL;..}.  
d990: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72    } else if (cer
d9a0: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  t != NULL) {..lo
d9b0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
d9c0: 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58   1;..if (SSL_CTX
d9d0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
d9e0: 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f  _ASN1(ctx, cert_
d9f0: 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29  len, cert) <= 0)
da00: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
da10: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
da20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
da30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
da40: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
da50: 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20  ficate: ",....  
da60: 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68     REASON(), (ch
da70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
da80: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
da90: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
daa0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
dab0: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65  else {..certfile
dac0: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67   = (char*)X509_g
dad0: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f  et_default_cert_
dae0: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53  file();...if (SS
daf0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
db00: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
db10: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49  certfile, SSL_FI
db20: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
db30: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54  ) {.#if 0..    T
db40: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
db50: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
db60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
db70: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73  p, "unable to us
db80: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66  e default certif
db90: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
dba0: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
dbb0: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20  .     REASON(), 
dbc0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dbd0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
dbe0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
dbf0: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  urn NULL;.#endif
dc00: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
dc10: 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74  * set our privat
dc20: 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20  e key */.    if 
dc30: 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  (load_private_ke
dc40: 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c  y) {..if (keyfil
dc50: 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79  e == NULL && key
dc60: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
dc70: 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66   keyfile = certf
dc80: 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65  ile;..}...if (ke
dc90: 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  yfile != NULL) {
dca0: 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65  ..    /* get the
dcb0: 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73   private key ass
dcc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
dcd0: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  s certificate */
dce0: 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c  ..    if (keyfil
dcf0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b  e == NULL) {...k
dd00: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
dd10: 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  e;..    }...    
dd20: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
dd30: 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28  PrivateKey_file(
dd40: 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65  ctx, F2N(keyfile
dd50: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45  , &ds), SSL_FILE
dd60: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
dd70: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
dd80: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
dd90: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
dda0: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
ddb0: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
ddc0: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
ddd0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
dde0: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
ddf0: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
de00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
de10: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
de20: 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c  blic key file ",
de30: 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09   keyfile, " ",..
de40: 09 09 20 20 20 20 20 20 20 20 20 52 45 41 53 4f  ..         REASO
de50: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
de60: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
de70: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
de80: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
de90: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
dea0: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65  Free(&ds);...} e
deb0: 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e  lse if (key != N
dec0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28  ULL) {..    if (
ded0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
dee0: 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f  ateKey_ASN1(EVP_
def0: 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b  PKEY_RSA, ctx, k
df00: 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30  ey,key_len) <= 0
df10: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
df20: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a  gFree(&ds);.../*
df30: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
df40: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
df50: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
df60: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
df70: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
df80: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
df90: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
dfa0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dfb0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
dfc0: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52  public key: ", R
dfd0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
dfe0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
dff0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
e000: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
e010: 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77    }..}../* Now w
e020: 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65  e know that a ke
e030: 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 20  y and cert have 
e040: 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74  been set against
e050: 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e  .. * the SSL con
e060: 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53  text */..if (!SS
e070: 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76  L_CTX_check_priv
e080: 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a  ate_key(ctx)) {.
e090: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e0a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
e0b0: 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20  rivate key does 
e0c0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65  not match the ce
e0d0: 72 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63  rtificate public
e0e0: 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28   key",....     (
e0f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e100: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
e110: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
e120: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20  rn NULL;..}.    
e130: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65  }..    /* Set ve
e140: 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a  rification CAs *
e150: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
e160: 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20  gInit(&ds);.    
e170: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
e180: 26 64 73 31 29 3b 0a 20 20 20 20 2f 2a 20 54 68  &ds1);.    /* Th
e190: 65 72 65 20 69 73 20 6f 6e 65 20 64 65 66 61 75  ere is one defau
e1a0: 6c 74 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 6e  lt directory, on
e1b0: 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 2c 20  e default file, 
e1c0: 61 6e 64 20 6f 6e 65 20 64 65 66 61 75 6c 74 20  and one default 
e1d0: 73 74 6f 72 65 2e 0a 09 54 68 65 20 64 65 66 61  store...The defa
e1e0: 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61  ult CA certifica
e1f0: 74 65 73 20 64 69 72 65 63 74 6f 72 79 20 28 61  tes directory (a
e200: 6e 64 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65  nd default store
e210: 29 20 69 73 20 69 6e 20 74 68 65 20 4f 70 65 6e  ) is in the Open
e220: 53 53 4c 0a 09 63 65 72 74 73 20 64 69 72 65 63  SSL..certs direc
e230: 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20  tory. It can be 
e240: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
e250: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65  e SSL_CERT_DIR e
e260: 6e 76 20 76 61 72 2e 20 54 68 65 0a 09 64 65 66  nv var. The..def
e270: 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 63  ault CA certific
e280: 61 74 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c  ates file is cal
e290: 6c 65 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20  led cert.pem in 
e2a0: 74 68 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e  the default Open
e2b0: 53 53 4c 0a 09 64 69 72 65 63 74 6f 72 79 2e 20  SSL..directory. 
e2c0: 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  It can be overri
e2d0: 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f  dden by the SSL_
e2e0: 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61  CERT_FILE env va
e2f0: 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 53 53  r. */../* int SS
e300: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e310: 74 5f 76 65 72 69 66 79 5f 64 69 72 28 53 53 4c  t_verify_dir(SSL
e320: 5f 43 54 58 20 2a 63 74 78 29 20 61 6e 64 20 69  _CTX *ctx) and i
e330: 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64  nt SSL_CTX_set_d
e340: 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 66 69  efault_verify_fi
e350: 6c 65 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29  le(SSL_CTX *ctx)
e360: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c   */.    if (!SSL
e370: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
e380: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20  _locations(ctx, 
e390: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
e3a0: 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73  , F2N(CAdir, &ds
e3b0: 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58  1)) ||..!SSL_CTX
e3c0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
e3d0: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20  ify_paths(ctx)) 
e3e0: 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74  {.#if 0..Tcl_DSt
e3f0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
e400: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
e410: 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74  &ds1);../* Don't
e420: 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20   currently care 
e430: 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f  if this fails */
e440: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e450: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20  lt(interp, "SSL 
e460: 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 20 70  default verify p
e470: 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28  aths: ", REASON(
e480: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
e490: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e4a0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e4b0: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ULL;.#endif.    
e4c0: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  }..    /* https:
e4d0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
e4e0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
e4f0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54   */.    /* XXX:T
e500: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65  ODO: Let the use
e510: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20  r supply values 
e520: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20  here instead of 
e530: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65  something that e
e540: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c  xists on the fil
e550: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69  esystem */.    i
e560: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
e570: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58  L) {..STACK_OF(X
e580: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
e590: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
e5a0: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
e5b0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
e5c0: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73  ;..if (certNames
e5d0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
e5e0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
e5f0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
e600: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a   certNames);..}.
e610: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
e620: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
e630: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
e640: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20  Free(&ds1);.    
e650: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
e660: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
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 0a 20 2a 0a 20 2a 20 53  --------. *. * S
e6b0: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
e6c0: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
e6d0: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
e6e0: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  peer.. *. * Resu
e6f0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
e700: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
e710: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
e720: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
e730: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
e780: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64  int.StatusObjCmd
e790: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
e7a0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
e7b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
e7c0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
e7d0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
e7e0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
e7f0: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65  tr;.    X509 *pe
e800: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  er;.    Tcl_Obj 
e810: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c  *objPtr;.    Tcl
e820: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
e830: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c     char *channel
e840: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a  Name, *ciphers;.
e850: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
e860: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
e870: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
e880: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c    unsigned int l
e890: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c  en;.    int nid,
e8a0: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e   res;..    dprin
e8b0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
e8c0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20     if (objc < 2 
e8d0: 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28  || objc > 3 || (
e8e0: 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74  objc == 3 && !st
e8f0: 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
e900: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c  ng(objv[1]), "-l
e910: 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f  ocal"))) {..Tcl_
e920: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e930: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
e940: 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22  -local? channel"
e950: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
e960: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
e970: 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20   /* Get channel 
e980: 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65  Id */.    channe
e990: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  lName = Tcl_GetS
e9a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
e9b0: 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31  v[(objc == 2 ? 1
e9c0: 20 3a 20 32 29 5d 2c 20 28 54 63 6c 5f 53 69 7a   : 2)], (Tcl_Siz
e9d0: 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  e *) NULL);.    
e9e0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
e9f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
ea00: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65  annelName, &mode
ea10: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
ea20: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
ea30: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
ea40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ea50: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
ea60: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
ea70: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
ea80: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
ea90: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
eaa0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
eab0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
eac0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
ead0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
eae0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
eaf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
eb00: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
eb10: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
eb20: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
eb30: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
eb40: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
eb50: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
eb60: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
eb70: 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45  STATUS", "CHANNE
eb80: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
eb90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
eba0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ebb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
ebc0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
ebd0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
ebe0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
ebf0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63  );..    /* Get c
ec00: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70  ertificate for p
ec10: 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20  eer or self */. 
ec20: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
ec30: 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  ) {..peer = SSL_
ec40: 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69  get_peer_certifi
ec50: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
ec60: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
ec70: 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
ec80: 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  t_certificate(st
ec90: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
eca0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
ecb0: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
ecc0: 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20   info */.    if 
ecd0: 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72  (peer) {..objPtr
ece0: 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62   = Tls_NewX509Ob
ecf0: 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b  j(interp, peer);
ed00: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29  ..if (objc == 2)
ed10: 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65   {..    X509_fre
ed20: 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65  e(peer);..    pe
ed30: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  er = NULL;..}.  
ed40: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50    } else {..objP
ed50: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
ed60: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
ed70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72    }..    /* Peer
ed80: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50   name */.    LAP
ed90: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
eda0: 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61   objPtr, "peerna
edb0: 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65  me", SSL_get0_pe
edc0: 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  ername(statePtr-
edd0: 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20  >ssl), -1);.    
ede0: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
edf0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69  rp, objPtr, "sbi
ee00: 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70  ts", SSL_get_cip
ee10: 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74  her_bits(statePt
ee20: 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a  r->ssl, NULL));.
ee30: 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28  .    ciphers = (
ee40: 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69  char*)SSL_get_ci
ee50: 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73  pher(statePtr->s
ee60: 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  sl);.    LAPPEND
ee70: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
ee80: 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63  Ptr, "cipher", c
ee90: 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20  iphers, -1);..  
eea0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
eeb0: 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
eec0: 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68   presented by th
eed0: 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41  e peer */.    LA
eee0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
eef0: 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
ef00: 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f  yResult",..X509_
ef10: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f  verify_cert_erro
ef20: 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74  r_string(SSL_get
ef30: 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73  _verify_result(s
ef40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20  tatePtr->ssl)), 
ef50: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  -1);..    /* Ver
ef60: 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ify mode */.    
ef70: 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76  mode = SSL_get_v
ef80: 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65  erify_mode(state
ef90: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69  Ptr->ssl);.    i
efa0: 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
efb0: 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c  ERIFY_NONE) {..L
efc0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
efd0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
efe0: 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c  fyMode", "none",
eff0: 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65   -1);.    } else
f000: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73   {..Tcl_Obj *lis
f010: 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  tObjPtr = Tcl_Ne
f020: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
f030: 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  );..if (mode && 
f040: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29  SSL_VERIFY_PEER)
f050: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
f060: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f070: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
f080: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
f090: 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31  ngObj("peer", -1
f0a0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
f0b0: 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   && SSL_VERIFY_F
f0c0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
f0d0: 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ERT) {..    Tcl_
f0e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f0f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
f100: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
f110: 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20  StringObj("fail 
f120: 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22  if no peer cert"
f130: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
f140: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
f150: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20  FY_CLIENT_ONCE) 
f160: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
f170: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f180: 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
f190: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
f1a0: 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63  gObj("client onc
f1b0: 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  e", -1));..}..if
f1c0: 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
f1d0: 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48  RIFY_POST_HANDSH
f1e0: 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  AKE) {..    Tcl_
f1f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f200: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
f210: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
f220: 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20  StringObj("post 
f230: 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29  handshake", -1))
f240: 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42  ;..}..LAPPEND_OB
f250: 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  J(interp, objPtr
f260: 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  , "verifyMode", 
f270: 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20  listObjPtr).    
f280: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  }..    /* Verify
f290: 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20   mode depth */. 
f2a0: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
f2b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
f2c0: 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53  verifyDepth", SS
f2d0: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70  L_get_verify_dep
f2e0: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
f2f0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f  ));..    /* Repo
f300: 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
f310: 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
f320: 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f  sult of the nego
f330: 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53  tiation */.    S
f340: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  SL_get0_alpn_sel
f350: 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e  ected(statePtr->
f360: 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ssl, &proto, &le
f370: 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  n);.    LAPPEND_
f380: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
f390: 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61  tr, "alpn", (cha
f3a0: 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f  r *)proto, (Tcl_
f3b0: 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20  Size) len);.    
f3c0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
f3d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f  rp, objPtr, "pro
f3e0: 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  tocol", SSL_get_
f3f0: 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72  version(statePtr
f400: 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20  ->ssl), -1);..  
f410: 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e    /* Valid for n
f420: 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65  on-RSA signature
f430: 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a   and TLS 1.3 */.
f440: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
f450: 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  2) {..res = SSL_
f460: 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75  get_peer_signatu
f470: 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  re_nid(statePtr-
f480: 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20  >ssl, &nid);.   
f490: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
f4a0: 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75   SSL_get_signatu
f4b0: 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  re_nid(statePtr-
f4c0: 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20  >ssl, &nid);.   
f4d0: 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29   }.    if (!res)
f4e0: 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20   {nid = 0;}.    
f4f0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
f500: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67  rp, objPtr, "sig
f510: 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69  natureHashAlgori
f520: 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e  thm", OBJ_nid2ln
f530: 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  (nid), -1);..   
f540: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
f550: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
f560: 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
f570: 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
f580: 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
f590: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
f5a0: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
f5b0: 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
f5c0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
f5d0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
f5e0: 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
f5f0: 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
f600: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
f610: 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70  r, "signatureTyp
f620: 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  e", OBJ_nid2ln(n
f630: 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54  id), -1);..    T
f640: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
f650: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
f660: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f670: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20  OK;..clientData 
f680: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a  = clientData;.}.
f690: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
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 0a 20 2a 0a 20 2a  ----------. *. *
f6e0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
f6f0: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
f700: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  connection info 
f710: 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a  from OpenSSL.. *
f720: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
f730: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63  A list of connec
f740: 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a  tion info.  *. *
f750: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
f7a0: 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  int ConnectionIn
f7b0: 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  foObjCmd(ClientD
f7c0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
f7d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f7e0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
f7f0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
f800: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
f810: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
f820: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
f830: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f  set a mode on */
f840: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
f850: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
f860: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
f870: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c  ocket */.    Tcl
f880: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c  _Obj *objPtr, *l
f890: 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  istPtr;.    cons
f8a0: 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20  t SSL *ssl;.    
f8b0: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52  const SSL_CIPHER
f8c0: 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f   *cipher;.    co
f8d0: 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  nst SSL_SESSION 
f8e0: 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f  *session;.    co
f8f0: 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a  nst EVP_MD *md;.
f900: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
f910: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
f920: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f930: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
f940: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  l");..return(TCL
f950: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
f960: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
f970: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
f980: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
f990: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
f9a0: 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c  (Tcl_Size *) NUL
f9b0: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
f9c0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
f9d0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
f9e0: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
f9f0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
fa00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
fa10: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
fa20: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
fa30: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
fa40: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
fa50: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
fa60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
fa70: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
fa80: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
fa90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
faa0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
fab0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
fac0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
fad0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
fae0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
faf0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  ", NULL);..Tcl_S
fb00: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
fb10: 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e  rp, "TLS", "CONN
fb20: 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45  ECTION", "CHANNE
fb30: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
fb40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
fb50: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
fb60: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  );.    }..    ob
fb70: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
fb80: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
fb90: 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  .    /* Connecti
fba0: 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
fbb0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
fbc0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
fbd0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
fbe0: 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
fbf0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
fc00: 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
fc10: 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74  L) {../* connect
fc20: 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41  ion state */..LA
fc30: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
fc40: 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65  , objPtr, "state
fc50: 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  ", SSL_state_str
fc60: 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
fc70: 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49  1);.../* Get SNI
fc80: 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65   requested serve
fc90: 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45  r name */..LAPPE
fca0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
fcb0: 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61  bjPtr, "serverna
fcc0: 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72  me", SSL_get_ser
fcd0: 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
fce0: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
fcf0: 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09  t_name), -1);...
fd00: 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20  /* Get protocol 
fd10: 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
fd20: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fd30: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f  "protocol", SSL_
fd40: 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29  get_version(ssl)
fd50: 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65  , -1);.../* Rene
fd60: 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65  gotiation allowe
fd70: 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  d */..LAPPEND_BO
fd80: 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
fd90: 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f  r, "renegotiatio
fda0: 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f  n_allowed", SSL_
fdb0: 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67  get_secure_reneg
fdc0: 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74  otiation_support
fdd0: 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  (ssl));.../* Get
fde0: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
fdf0: 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  */..LAPPEND_INT(
fe00: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fe10: 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22  "security_level"
fe20: 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69  , SSL_get_securi
fe30: 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a  ty_level(ssl));.
fe40: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66  ../* Session inf
fe50: 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  o */..LAPPEND_BO
fe60: 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
fe70: 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73  r, "session_reus
fe80: 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e  ed", SSL_session
fe90: 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a  _reused(ssl));..
fea0: 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e  ./* Is server in
feb0: 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  fo */..LAPPEND_B
fec0: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
fed0: 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c  tr, "is_server",
fee0: 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73   SSL_is_server(s
fef0: 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54  sl));.../* Is DT
ff00: 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  LS */..LAPPEND_B
ff10: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
ff20: 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53  tr, "is_dtls", S
ff30: 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29  SL_is_dtls(ssl))
ff40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ff50: 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20  Cipher info */. 
ff60: 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f     cipher = SSL_
ff70: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68  get_current_ciph
ff80: 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  er(ssl);.    if 
ff90: 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29  (cipher != NULL)
ffa0: 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46   {..char buf[BUF
ffb0: 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74  SIZ] = {0};..int
ffc0: 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b   bits, alg_bits;
ffd0: 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d  .../* Cipher nam
ffe0: 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  e */..LAPPEND_ST
fff0: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10000 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f  , "cipher", SSL_
10010 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
10020 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
10030 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63  /* RFC name of c
10040 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
10050 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10060 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f  jPtr, "standard_
10070 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45  name", SSL_CIPHE
10080 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28  R_standard_name(
10090 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
100a0 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20  /* OpenSSL name 
100b0 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  of cipher */..LA
100c0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
100d0 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73  , objPtr, "opens
100e0 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53  sl_name", OPENSS
100f0 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53  L_cipher_name(SS
10100 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72  L_CIPHER_standar
10110 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c  d_name(cipher)),
10120 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65   -1);.../* numbe
10130 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 73  r of secret bits
10140 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 72   used for cipher
10150 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f   */..bits = SSL_
10160 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28  CIPHER_get_bits(
10170 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74  cipher, &alg_bit
10180 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
10190 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
101a0 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20   "secret_bits", 
101b0 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
101c0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
101d0 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62  tr, "algorithm_b
101e0 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b  its", alg_bits);
101f0 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73  ../* alg_bits is
10200 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72   actual key secr
10210 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20  et bits. If use 
10220 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20  bits and secret 
10230 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73  (algorithm) bits
10240 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65   differ,..   the
10250 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74   rest of the bit
10260 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65  s are fixed, i.e
10270 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78  . for limited ex
10280 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69  port ciphers (bi
10290 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a  ts < 56) */.../*
102a0 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 68   Indicates which
102b0 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f   SSL/TLS protoco
102c0 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20  l version first 
102d0 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 68  defined the ciph
102e0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
102f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10300 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22  r, "min_version"
10310 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  , SSL_CIPHER_get
10320 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29  _version(cipher)
10330 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68  , -1);.../* Ciph
10340 65 72 20 4e 49 44 2c 20 64 69 67 65 73 74 20 4e  er NID, digest N
10350 49 44 20 28 6e 6f 6e 65 20 66 6f 72 20 41 45 41  ID (none for AEA
10360 44 20 63 69 70 68 65 72 20 73 75 69 74 65 73 29  D cipher suites)
10370 2c 20 4b 65 79 20 45 78 63 68 61 6e 67 65 20 4e  , Key Exchange N
10380 49 44 2c 20 61 6e 64 20 61 75 74 68 65 6e 74 69  ID, and authenti
10390 63 61 74 69 6f 6e 20 4e 49 44 20 2a 2f 0a 09 4c  cation NID */..L
103a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
103b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
103c0 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  erNID", (char *)
103d0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
103e0 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72  IPHER_get_cipher
103f0 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
10400 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
10410 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10420 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63   "digestNID", (c
10430 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
10440 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
10450 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65  digest_nid(ciphe
10460 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
10470 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10480 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61  bjPtr, "keyExcha
10490 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  ngeNID", (char *
104a0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
104b0 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69  CIPHER_get_kx_ni
104c0 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
104d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
104e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
104f0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44  uthenticationNID
10500 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
10510 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
10520 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69  _get_auth_nid(ci
10530 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f  pher)), -1);.../
10540 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e  * message authen
10550 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20  tication code - 
10560 43 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28  Cipher is AEAD (
10570 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43  e.g. GCM or ChaC
10580 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f  ha20/Poly1305) o
10590 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74  r not */../* Aut
105a0 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79  henticated Encry
105b0 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63  ption with assoc
105c0 69 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44  iated data (AEAD
105d0 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50  ) check */..LAPP
105e0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
105f0 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
10600 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43  _is_aead", SSL_C
10610 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69  IPHER_is_aead(ci
10620 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  pher));.../* Get
10630 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69   OpenSSL-specifi
10640 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49  c ID, not IANA I
10650 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  D */..LAPPEND_IN
10660 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
10670 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28  , "cipher_id", (
10680 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f  int) SSL_CIPHER_
10690 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b  get_id(cipher));
106a0 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49  .../* Two-byte I
106b0 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c  D used in the TL
106c0 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68  S protocol of th
106d0 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a  e given cipher *
106e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  /..LAPPEND_INT(i
106f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10700 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69  protocol_id", (i
10710 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
10720 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63  et_protocol_id(c
10730 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65  ipher));.../* Te
10740 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f  xtual descriptio
10750 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 2e  n of the cipher.
10760 20 49 6e 63 6c 75 64 65 73 3a 20 63 69 70 68 65   Includes: ciphe
10770 72 20 6e 61 6d 65 2c 20 70 72 6f 74 6f 63 6f 6c  r name, protocol
10780 20 76 65 72 73 69 6f 6e 2c 20 6b 65 79 0a 09 20   version, key.. 
10790 20 20 65 78 63 68 61 6e 67 65 2c 20 61 75 74 68    exchange, auth
107a0 65 6e 74 69 63 61 74 69 6f 6e 2c 20 73 79 6d 6d  entication, symm
107b0 65 74 72 69 63 20 65 6e 63 72 79 70 74 69 6f 6e  etric encryption
107c0 20 6d 65 74 68 6f 64 2c 20 6d 65 73 73 61 67 65   method, message
107d0 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
107e0 63 6f 64 65 20 2a 2f 0a 09 69 66 20 28 53 53 4c  code */..if (SSL
107f0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
10800 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
10810 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
10820 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
10830 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10840 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
10850 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
10860 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 69 67 65 73  );..}.../* Diges
10870 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68  t used during th
10880 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68  e SSL/TLS handsh
10890 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74  ake when using t
108a0 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d  he cipher. */..m
108b0 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  d = SSL_CIPHER_g
108c0 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  et_handshake_dig
108d0 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41  est(cipher);..LA
108e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
108f0 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73  , objPtr, "hands
10900 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63  hake_digest", (c
10910 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d  har *)EVP_MD_nam
10920 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 20 20 20 20  e(md), -1);.    
10930 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  }..    /* Sessio
10940 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65  n info */.    se
10950 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f  ssion = SSL_get_
10960 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20  session(ssl);.  
10970 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d    if (session !=
10980 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20   NULL) {..const 
10990 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
109a0 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c  icket;..size_t l
109b0 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  en2;..unsigned i
109c0 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20  nt ulen;..const 
109d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
109e0 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74  ession_id, *prot
109f0 6f 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b  o;..char buffer[
10a00 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b  SSL_MAX_MASTER_K
10a10 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a  EY_LENGTH];.../*
10a20 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
10a30 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
10a40 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10a50 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f   ALPN negotiatio
10a60 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f  n */..SSL_SESSIO
10a70 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65  N_get0_alpn_sele
10a80 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70  cted(session, &p
10a90 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c  roto, &len2);..L
10aa0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10ab0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e  p, objPtr, "alpn
10ac0 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74  ", (char *) prot
10ad0 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  o, (Tcl_Size) le
10ae0 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74  n2);.../* Report
10af0 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
10b00 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
10b10 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65  lt of the NPN ne
10b20 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66  gotiation */.#if
10b30 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c  def USE_NPN..SSL
10b40 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f  _get0_next_proto
10b50 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c  _negotiated(ssl,
10b60 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b   &proto, &ulen);
10b70 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10b80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e  terp, objPtr, "n
10b90 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72  pn", (char *) pr
10ba0 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  oto, (Tcl_Size) 
10bb0 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ulen);.#endif...
10bc0 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73  /* Resumable ses
10bd0 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  sion */..LAPPEND
10be0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
10bf0 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65  jPtr, "resumable
10c00 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69  ", SSL_SESSION_i
10c10 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73  s_resumable(sess
10c20 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ion));.../* Sess
10c30 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28  ion start time (
10c40 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70  seconds since ep
10c50 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  och) */..LAPPEND
10c60 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62  _LONG(interp, ob
10c70 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d  jPtr, "start_tim
10c80 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
10c90 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e  get_time(session
10ca0 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74  ));.../* Timeout
10cb0 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58   value - SSL_CTX
10cc0 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e  _get_timeout (in
10cd0 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41   seconds) */..LA
10ce0 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
10cf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65  p, objPtr, "time
10d00 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  out", SSL_SESSIO
10d10 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65  N_get_timeout(se
10d20 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65  ssion));.../* Se
10d30 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31  ssion id - TLSv1
10d40 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c  .2 and below onl
10d50 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  y */..session_id
10d60 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
10d70 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
10d80 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
10d90 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
10da0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
10db0 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  id", session_id,
10dc0 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e   (Tcl_Size) ulen
10dd0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
10de0 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73  context */..sess
10df0 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
10e00 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e  SION_get0_id_con
10e10 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75  text(session, &u
10e20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  len);..LAPPEND_B
10e30 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
10e40 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63  jPtr, "session_c
10e50 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e  ontext", session
10e60 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  _id, (Tcl_Size) 
10e70 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ulen);.../* Sess
10e80 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69  ion ticket - cli
10e90 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c  ent only */..SSL
10ea0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
10eb0 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74  cket(session, &t
10ec0 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09  icket, &len2);..
10ed0 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
10ee0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10ef0 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c  session_ticket",
10f00 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69   ticket, (Tcl_Si
10f10 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
10f20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c  Session ticket l
10f30 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e  ifetime hint (in
10f40 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41   seconds) */..LA
10f50 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
10f60 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65  p, objPtr, "life
10f70 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
10f80 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
10f90 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
10fa0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b  ion));.../* Tick
10fb0 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09  et app data */..
10fc0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
10fd0 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28  _ticket_appdata(
10fe0 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
10ff0 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45  , &len2);..LAPPE
11000 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
11010 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65  , objPtr, "ticke
11020 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63  t_app_data", tic
11030 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ket, (Tcl_Size) 
11040 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  len2);.../* Get 
11050 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c  master key */..l
11060 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  en2 = SSL_SESSIO
11070 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79  N_get_master_key
11080 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72  (session, buffer
11090 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52  , SSL_MAX_MASTER
110a0 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c  _KEY_LENGTH);..L
110b0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
110c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d  terp, objPtr, "m
110d0 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66  aster_key", buff
110e0 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  er, (Tcl_Size) l
110f0 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72  en2);.../* Compr
11100 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e  ession id */..un
11110 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20  signed int id = 
11120 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
11130 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73  compress_id(sess
11140 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  ion);..LAPPEND_S
11150 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11160 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f  r, "compression_
11170 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22  id", id == 1 ? "
11180 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20  zlib" : "none", 
11190 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  -1);.    }..    
111a0 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
111b0 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  nfo */.    if (s
111c0 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69  sl != NULL) {.#i
111d0 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f  fdef HAVE_SSL_CO
111e0 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74  MPRESSION..const
111f0 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f   COMP_METHOD *co
11200 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70  mp, *expn;..comp
11210 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
11220 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73  nt_compression(s
11230 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c  sl);..expn = SSL
11240 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70  _get_current_exp
11250 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c  ansion(ssl);...L
11260 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11270 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
11280 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f  ression", comp ?
11290 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
112a0 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65  me(comp) : "none
112b0 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ", -1);..LAPPEND
112c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
112d0 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22  Ptr, "expansion"
112e0 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d  , expn ? SSL_COM
112f0 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29  P_get_name(expn)
11300 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
11310 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53  #else..LAPPEND_S
11320 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11330 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  r, "compression"
11340 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09  , "none", -1);..
11350 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11360 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70  rp, objPtr, "exp
11370 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c  ansion", "none",
11380 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20   -1);.#endif.   
11390 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65   }..    /* Serve
113a0 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a  r info */.    {.
113b0 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c  .long mode = SSL
113c0 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e  _CTX_get_session
113d0 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74  _cache_mode(stat
113e0 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61  ePtr->ctx);..cha
113f0 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f  r *msg;...if (mo
11400 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
11410 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20  CHE_OFF) {..    
11420 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20  msg = "off";..} 
11430 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
11440 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43  SSL_SESS_CACHE_C
11450 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73  LIENT) {..    ms
11460 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d  g = "client";..}
11470 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
11480 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
11490 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d  SERVER) {..    m
114a0 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09  sg = "server";..
114b0 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
114c0 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
114d0 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73  _BOTH) {..    ms
114e0 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65  g = "both";..} e
114f0 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  lse {..    msg =
11500 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09   "unknown";..}..
11510 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11520 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
11530 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22  sion_cache_mode"
11540 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20  , msg, -1);.    
11550 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73  }..    /* CA Lis
11560 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e  t */.    /* IF n
11570 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d  ot a server, sam
11580 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65  e as SSL_get0_pe
11590 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73  er_CA_list. If s
115a0 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53 53  erver same as SS
115b0 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74  L_CTX_get_client
115c0 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20  _CA_list */.    
115d0 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65  listPtr = Tcl_Ne
115e0 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
115f0 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  );.    STACK_OF(
11600 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c  X509_NAME) *ca_l
11610 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61  ist;.    if ((ca
11620 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f  _list = SSL_get_
11630 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73  client_CA_list(s
11640 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  sl)) != NULL) {.
11650 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55 46  .char buffer[BUF
11660 53 49 5a 5d 3b 0a 0a 09 66 6f 72 20 28 69 6e 74  SIZ];...for (int
11670 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58   i = 0; i < sk_X
11680 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
11690 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20  list); i++) {.. 
116a0 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61     X509_NAME *na
116b0 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d  me = sk_X509_NAM
116c0 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c  E_value(ca_list,
116d0 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61   i);..    if (na
116e0 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d  me) {...X509_NAM
116f0 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20  E_oneline(name, 
11700 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
11710 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
11720 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11730 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
11740 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75  _NewStringObj(bu
11750 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20  ffer, -1));..   
11760 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20   }..}.    }.    
11770 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
11780 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
11790 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a  ist", listPtr);.
117a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
117b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
117c0 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73  "caListCount", s
117d0 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28  k_X509_NAME_num(
117e0 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 0a 20 20 20  ca_list));...   
117f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11800 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
11810 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11820 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
11830 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
11840 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
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 0a 20 2a 0a  ------------. *.
11890 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d   * MiscObjCmd --
118a0 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20   misc commands. 
118b0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
118c0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
118d0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
118e0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
118f0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
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 0a 20 2a  -------------. *
11940 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73  /.static int.Mis
11950 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  cObjCmd(ClientDa
11960 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
11970 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11980 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
11990 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
119a0 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63  []) {.    static
119b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d   const char *com
119c0 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65  mands [] = { "re
119d0 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55  q", "strreq", NU
119e0 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63  LL };.    enum c
119f0 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20  ommand { C_REQ, 
11a00 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d  C_STRREQ, C_DUMM
11a10 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  Y };.    Tcl_Siz
11a20 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69  e cmd;.    int i
11a30 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62  sStr;.    char b
11a40 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20  uffer[16384];.. 
11a50 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
11a60 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
11a70 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f  bjc < 2) {..Tcl_
11a80 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11a90 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73  erp, 1, objv, "s
11aa0 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f  ubcommand ?args?
11ab0 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
11ac0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11ad0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
11ae0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
11af0 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e   objv[1], comman
11b00 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30  ds, "command", 0
11b10 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f  , &cmd) != TCL_O
11b20 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
11b30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11b40 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
11b50 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72  or();..    isStr
11b60 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52   = (cmd == C_STR
11b70 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68  REQ);.    switch
11b80 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29   ((enum command)
11b90 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f   cmd) {..case C_
11ba0 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52  REQ:..case C_STR
11bb0 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f  REQ: {..    EVP_
11bc0 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b  PKEY *pkey=NULL;
11bd0 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74  ..    X509 *cert
11be0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
11bf0 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c  _NAME *name=NULL
11c00 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  ;..    Tcl_Obj *
11c10 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c  *listv;..    Tcl
11c20 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20  _Size listc;..  
11c30 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42    int i;...    B
11c40 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09  IO *out=NULL;...
11c50 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22      char *k_C=""
11c60 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22  ,*k_ST="",*k_L="
11c70 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d  ",*k_O="",*k_OU=
11c80 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45  "",*k_CN="",*k_E
11c90 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68  mail="";..    ch
11ca0 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f  ar *keyout,*pemo
11cb0 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e  ut,*str;..    in
11cc0 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c  t keysize,serial
11cd0 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69  =0,days=365;..#i
11ce0 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
11cf0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
11d00 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e  00000L..    BIGN
11d10 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a  UM *bne = NULL;.
11d20 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20  .    RSA *rsa = 
11d30 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20  NULL;.#else..   
11d40 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63   EVP_PKEY_CTX *c
11d50 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  tx = NULL;.#endi
11d60 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a  f...    if ((obj
11d70 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29  c<5) || (objc>6)
11d80 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e  ) {...Tcl_WrongN
11d90 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
11da0 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65  , objv, "keysize
11db0 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c   keyfile certfil
11dc0 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65  e ?info?");...re
11dd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11de0 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
11df0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
11e00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11e10 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d  2], &keysize) !=
11e20 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74   TCL_OK) {...ret
11e30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
11e40 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75      }..    keyou
11e50 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
11e60 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70  objv[3]);..    p
11e70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  emout=Tcl_GetStr
11e80 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20  ing(objv[4]);.. 
11e90 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a     if (isStr) {.
11ea0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
11eb0 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29  erp,keyout,"",0)
11ec0 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69  ;...Tcl_SetVar(i
11ed0 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c  nterp,pemout,"",
11ee0 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  0);..    }...   
11ef0 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a   if (objc>=6) {.
11f00 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62  ..if (Tcl_ListOb
11f10 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
11f20 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c  erp, objv[5], &l
11f30 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d  istc, &listv) !=
11f40 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20   TCL_OK) {...   
11f50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11f60 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c  R;...}....if ((l
11f70 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a  istc%2) != 0) {.
11f80 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
11f90 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f  ult(interp,"Info
11fa0 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73  rmation list mus
11fb0 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62  t have even numb
11fc0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22  er of arguments"
11fd0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
11fe0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11ff0 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20  ..}...for (i=0; 
12000 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b  i<listc; i+=2) {
12010 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47  ...    str=Tcl_G
12020 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
12030 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74  ]);...    if (st
12040 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29  rcmp(str,"days")
12050 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
12060 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
12070 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
12080 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b  ],&days)!=TCL_OK
12090 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
120a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
120b0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
120c0 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29  mp(str,"serial")
120d0 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
120e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
120f0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
12100 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f  ],&serial)!=TCL_
12110 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
12120 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
12130 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
12140 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30  rcmp(str,"C")==0
12150 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47  ) {....k_C=Tcl_G
12160 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
12170 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
12180 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
12190 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"ST")==0) {...
121a0 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72  .k_ST=Tcl_GetStr
121b0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
121c0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
121d0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22   (strcmp(str,"L"
121e0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54  )==0) {....k_L=T
121f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12200 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
12210 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
12220 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b  p(str,"O")==0) {
12230 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53  ....k_O=Tcl_GetS
12240 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
12250 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
12260 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
12270 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  OU")==0) {....k_
12280 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  OU=Tcl_GetString
12290 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
122a0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
122b0 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d  trcmp(str,"CN")=
122c0 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63  =0) {....k_CN=Tc
122d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
122e0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
122f0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
12300 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30  (str,"Email")==0
12310 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54  ) {....k_Email=T
12320 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12330 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
12340 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f  } else {....Tcl_
12350 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
12360 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65  ,"Unknown parame
12370 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72  ter",NULL);....r
12380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12390 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
123a0 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
123b0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
123c0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20  < 0x30000000L.. 
123d0 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28     bne = BN_new(
123e0 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53  );..    rsa = RS
123f0 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b  A_new();..    pk
12400 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65  ey = EVP_PKEY_ne
12410 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e  w();..    if (bn
12420 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61  e == NULL || rsa
12430 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79   == NULL || pkey
12440 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f   == NULL || !BN_
12450 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41  set_word(bne,RSA
12460 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67  _F4) ||...!RSA_g
12470 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72  enerate_key_ex(r
12480 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65  sa, keysize, bne
12490 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f  , NULL) || !EVP_
124a0 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28  PKEY_assign_RSA(
124b0 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09  pkey, rsa)) {...
124c0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
124d0 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72  ey);.../* RSA_fr
124e0 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62  ee(rsa); freed b
124f0 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20  y EVP_PKEY_free 
12500 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65  */...BN_free(bne
12510 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b  );.#else..    pk
12520 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e  ey = EVP_RSA_gen
12530 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
12540 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63  keysize);..    c
12550 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54  tx = EVP_PKEY_CT
12560 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29  X_new(pkey,NULL)
12570 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20  ;..    if (pkey 
12580 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d  == NULL || ctx =
12590 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50  = NULL || !EVP_P
125a0 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28  KEY_keygen_init(
125b0 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50  ctx) ||...!EVP_P
125c0 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f  KEY_CTX_set_rsa_
125d0 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c  keygen_bits(ctx,
125e0 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56   keysize) || !EV
125f0 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74  P_PKEY_keygen(ct
12600 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45  x, &pkey)) {...E
12610 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
12620 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43  y);...EVP_PKEY_C
12630 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65  TX_free(ctx);.#e
12640 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65  ndif...Tcl_SetRe
12650 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
12660 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72  or generating pr
12670 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29  ivate key",NULL)
12680 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
12690 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73  RROR;..    } els
126a0 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29  e {...if (isStr)
126b0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
126c0 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
126d0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
126e0 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
126f0 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
12700 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
12710 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72  );...    i=BIO_r
12720 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73  ead(out,buffer,s
12730 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29  izeof(buffer)-1)
12740 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20  ;...    i=(i<0) 
12750 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62  ? 0 : i;...    b
12760 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09  uffer[i]='\0';..
12770 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
12780 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75  interp,keyout,bu
12790 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42  ffer,0);...    B
127a0 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09  IO_flush(out);..
127b0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75  .    BIO_free(ou
127c0 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t);...} else {..
127d0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
127e0 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
127f0 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f  ..    BIO_write_
12800 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79  filename(out,key
12810 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  out);...    PEM_
12820 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74  write_bio_Privat
12830 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55  eKey(out,pkey,NU
12840 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e  LL,NULL,0,NULL,N
12850 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50  ULL);...    /* P
12860 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41  EM_write_bio_RSA
12870 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20  PrivateKey(out, 
12880 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  rsa, NULL, NULL,
12890 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b   0, NULL, NULL);
128a0 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72   */...    BIO_fr
128b0 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09  ee_all(out);.. .
128c0 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58  }....if ((cert=X
128d0 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c  509_new())==NULL
128e0 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
128f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
12900 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  Error generating
12910 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71   certificate req
12920 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  uest",NULL);... 
12930 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
12940 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
12950 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
12960 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
12970 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
12980 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
12990 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52    return(TCL_ERR
129a0 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  OR);...}....X509
129b0 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
129c0 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
129d0 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
129e0 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
129f0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
12a00 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
12a10 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
12a20 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
12a30 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
12a40 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
12a50 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
12a60 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
12a70 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
12a80 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
12a90 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
12aa0 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
12ab0 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
12ac0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
12ad0 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
12ae0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
12af0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
12b00 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
12b10 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12b20 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12b30 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
12b40 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
12b50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
12b60 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
12b70 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12b80 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12b90 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
12ba0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
12bb0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
12bc0 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
12bd0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
12be0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
12bf0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
12c00 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
12c10 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
12c20 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
12c30 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12c40 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12c50 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
12c60 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
12c70 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
12c80 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
12c90 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12ca0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12cb0 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
12cc0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
12cd0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
12ce0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
12cf0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12d00 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12d10 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
12d20 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
12d30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
12d40 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
12d50 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
12d60 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
12d70 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
12d80 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
12d90 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
12da0 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
12db0 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
12dc0 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
12dd0 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
12de0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12df0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
12e00 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
12e10 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
12e20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
12e30 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
12e40 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
12e50 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
12e60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12e70 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
12e80 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
12e90 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
12ea0 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
12eb0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
12ec0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
12ed0 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
12ee0 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
12ef0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
12f00 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
12f10 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
12f20 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
12f30 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
12f40 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
12f50 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
12f60 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
12f70 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
12f80 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
12f90 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
12fa0 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
12fb0 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
12fc0 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
12fd0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
12fe0 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
12ff0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
13000 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
13010 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
13020 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13030 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
13040 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
13050 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
13060 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
13070 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
13080 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
13090 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
130a0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
130b0 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
130c0 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
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 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
13d20 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
13d30 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
13d40 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
13d50 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73  erp, "tls::hands
13d60 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65  hake", Handshake
13d70 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
13d80 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
13d90 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
13da0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
13db0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
13dc0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f  terp, "tls::impo
13dd0 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  rt", ImportObjCm
13de0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
13df0 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
13e00 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
13e10 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
13e20 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13e30 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69   "tls::misc", Mi
13e40 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  scObjCmd, (Clien
13e50 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
13e60 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
13e70 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
13e80 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13e90 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e  interp, "tls::un
13ea0 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72  import", Unimpor
13eb0 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
13ec0 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
13ed0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
13ee0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
13ef0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13f00 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61  nterp, "tls::sta
13f10 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43  tus", StatusObjC
13f20 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
13f30 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
13f40 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
13f50 0a 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74  ..    Tls_Digest
13f60 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29  Commands(interp)
13f70 3b 0a 20 20 20 20 54 6c 73 5f 45 6e 63 72 79 70  ;.    Tls_Encryp
13f80 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70  tCommands(interp
13f90 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f 43  );.    Tls_InfoC
13fa0 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b  ommands(interp);
13fb0 0a 20 20 20 20 54 6c 73 5f 4b 44 46 43 6f 6d 6d  .    Tls_KDFComm
13fc0 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20  ands(interp);.  
13fd0 20 20 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d 61 6e    Tls_RandComman
13fe0 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20  ds(interp);..   
13ff0 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09   if (interp) {..
14000 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
14010 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
14020 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  t);.    }..    r
14030 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f  eturn Tcl_PkgPro
14040 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43  vide(interp, PAC
14050 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41  KAGE_NAME, PACKA
14060 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a  GE_VERSION);.}..
14070 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14080 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a  -----------*. *.
140b0 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20   *.Tls_SafeInit 
140c0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
140d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a 09 53 74  ---------*. *.St
14100 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65  andard procedure
14110 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f   required by 'lo
14120 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ad'.. *.Initiali
14130 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
14140 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
14150 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
14160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a  --------------*.
14190 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
141a0 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
141b0 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
141c0 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
141d0 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
141e0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  -*. */.DLLEXPORT
14230 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
14240 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
14250 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
14260 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
14270 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e     return(Tls_In
14280 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a  it(interp));.}..
14290 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
142a0 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a  -----------*. *.
142d0 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
142e0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
14320 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
14330 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
14340 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
14380 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
14390 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
143a0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
143b0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
143c0 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
143d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
14410 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
14420 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
14430 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
14440 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
14450 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
14460 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
14470 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
14480 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
14490 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
144a0 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
144b0 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
144c0 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
144d0 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61  ) {..if (!initia
144e0 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70  lized) {..    dp
144f0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
14500 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75  uninitialize, bu
14510 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  t we are not ini
14520 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20  tialized");...  
14530 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
14540 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
14550 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
14560 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65  alize");..#if de
14570 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
14580 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
14590 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
145a0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
145b0 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c  nit_mx);...if (l
145c0 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65  ocks) {..    fre
145d0 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c  e(locks);..    l
145e0 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  ocks = NULL;..  
145f0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30    locksCount = 0
14600 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69  ;..}.#endif..ini
14610 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23  tialized = 0;..#
14620 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
14630 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
14640 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14650 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e  DS)..Tcl_MutexUn
14660 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
14670 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
14680 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a  TCL_OK);.    }..
14690 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69      if (initiali
146a0 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  zed) {..dprintf(
146b0 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69  "Called, but usi
146c0 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22  ng cached value"
146d0 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75  );..return(statu
146e0 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  s);.    }..    d
146f0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14700 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
14710 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
14720 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
14730 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
14740 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
14750 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
14760 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
14770 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
14780 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
14790 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
147a0 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
147b0 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
147c0 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
147d0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
147e0 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
147f0 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
14800 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
14810 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
14820 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
14830 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
14840 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
14850 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
14860 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
14870 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
14880 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
14890 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
148a0 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
148b0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
148c0 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
148d0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
148e0 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
148f0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
14900 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
14910 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
14920 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
14930 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20  if 0.    /*.    
14940 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d   * XXX:TODO: Rem
14950 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e  ove this code an
14960 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  d replace it wit
14970 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a  h a check.     *
14980 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72   for enough entr
14990 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  opy and do not t
149a0 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ry to create our
149b0 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72   own.     * terr
149c0 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20  ible entropy.   
149d0 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20    */.    /*.    
149e0 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64   * Seed the rand
149f0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
14a00 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  tor in the SSL l
14a10 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75  ibrary,.     * u
14a20 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c  sing the do/whil
14a30 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61  e construct beca
14a40 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e  use of the bug n
14a50 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ote in the.     
14a60 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
14a70 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
14a80 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
14a90 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20  faq.html#USER1. 
14aa0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
14ab0 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f   crux of the pro
14ac0 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c  blem is that Sol
14ad0 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20  aris 7 does not 
14ae0 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64  have a.     * /d
14af0 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
14b00 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
14b10 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
14b20 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
14b30 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
14b40 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
14b50 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
14b60 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
14b70 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
14b80 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
14b90 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
14ba0 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
14bb0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
14bc0 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
14bd0 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
14be0 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
14bf0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
14c00 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
14c10 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
14c20 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
14c30 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
14c40 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
14c50 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
14c60 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
14c70 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
14c80 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
14c90 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
14ca0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  1);.#endif..#if 
14cb0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
14cc0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
14cd0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
14ce0 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
14cf0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
14d00 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61  dif...return(sta
14d10 74 75 73 29 3b 0a 7d 0a                          tus);.}.