Hex Artifact Content

Artifact 9e57ea75de121919d0752032ca1d9ef0b32c64e41121d668ed0a5152ef9ef613:


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 64 70 72 69  k = 0;..    dpri
0bb0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
0bc0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
0bd0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
0be0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
0bf0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
0c00: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
0c10: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
0c20: 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 63 65  lback with succe
0c30: 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74  ss for ok or ret
0c40: 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69  urn value 1, fai
0c50: 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72  l for error or r
0c60: 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f  eturn value 0 */
0c70: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
0c80: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
0c90: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61    code = Tcl_Eva
0ca0: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63  lObjEx(interp, c
0cb0: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f  mdPtr, TCL_EVAL_
0cc0: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70 72  GLOBAL);.    dpr
0cd0: 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c 62 61  intf("EvalCallba
0ce0: 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a  ck: %d", code);.
0cf0: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
0d00: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68  TCL_OK) {../* Ch
0d10: 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72  eck result for r
0d20: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
0d30: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20  Tcl_Obj *result 
0d40: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
0d50: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20  lt(interp);..if 
0d60: 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20  (result == NULL 
0d70: 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  || Tcl_GetIntFro
0d80: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73  mObj(interp, res
0d90: 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c  ult, &ok) != TCL
0da0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d  _OK) {..    ok =
0db0: 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28   1;..}..dprintf(
0dc0: 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b  "Result: %d", ok
0dd0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
0de0: 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a 65  ./* Error - reje
0df0: 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ct the certifica
0e00: 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22  te */..dprintf("
0e10: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
0e20: 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f  ror");.#if (TCL_
0e30: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
0e40: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
0e50: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
0e60: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
0e70: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c  ror(interp);.#el
0e80: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
0e90: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
0ea0: 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69  rp, code);.#endi
0eb0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  f.    }..    Tcl
0ec0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
0ed0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
0ee0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
0ef0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
0f00: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72  terp);.    retur
0f10: 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  n ok;.}.../*. *-
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c  --. *. * InfoCal
0f70: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
0f80: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e  onitors SSL conn
0f90: 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20  ection process. 
0fa0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
0fb0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
0fc0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
0fd0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
0fe0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d  defined). *. *--
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -. */.static voi
1040: 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63  d.InfoCallback(c
1050: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69  onst SSL *ssl, i
1060: 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65  nt where, int re
1070: 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  t) {.    State *
1080: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
1090: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
10a0: 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b  ata((SSL *)ssl);
10b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
10c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
10d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
10e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
10f0: 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72  .    char *major
1100: 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a  ; char *minor;..
1110: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
1120: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
1130: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
1140: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
1150: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a  NULL)..return;..
1160: 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20      if (where & 
1170: 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45  SSL_CB_HANDSHAKE
1180: 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72  _START) {..major
1190: 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a   = "handshake";.
11a0: 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22  .minor = "start"
11b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
11c0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
11d0: 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20  HANDSHAKE_DONE) 
11e0: 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64  {..major = "hand
11f0: 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d  shake";..minor =
1200: 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65   "done";.    } e
1210: 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65  lse {..if (where
1220: 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29   & SSL_CB_ALERT)
1230: 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74  ..major = "alert
1240: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1250: 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e  re & SSL_ST_CONN
1260: 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f  ECT).major = "co
1270: 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66  nnect";..else if
1280: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54   (where & SSL_ST
1290: 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20  _ACCEPT)..major 
12a0: 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73  = "accept";..els
12b0: 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75  e.....major = "u
12c0: 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77  nknown";...if (w
12d0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45  here & SSL_CB_RE
12e0: 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65  AD)..minor = "re
12f0: 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  ad";..else if (w
1300: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52  here & SSL_CB_WR
1310: 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77  ITE)..minor = "w
1320: 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20  rite";..else if 
1330: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1340: 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22  LOOP)..minor = "
1350: 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20  loop";..else if 
1360: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1370: 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22  EXIT)..minor = "
1380: 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  exit";..else....
1390: 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .minor = "unknow
13a0: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  n";.    }..    /
13b0: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
13c0: 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20   to eval */.    
13d0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
13e0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
13f0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
1400: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
1410: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1420: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
1430: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e  NewStringObj("in
1440: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  fo", -1));.    T
1450: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1460: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1470: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
1480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
1490: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
14a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
14b0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
14c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
14e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
14f0: 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29  ngObj(major, -1)
1500: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1510: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1520: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1530: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1540: 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20  (minor, -1));.. 
1550: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53     if (where & S
1560: 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09  SL_CB_ALERT) {..
1570: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1580: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1590: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
15a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
15b0: 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74  SL_alert_desc_st
15c0: 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20  ring_long(ret), 
15d0: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
15e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
15f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1600: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
1610: 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f  ngObj(SSL_alert_
1620: 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  type_string_long
1630: 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20  (ret), -1));.   
1640: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c   } else {..Tcl_L
1650: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1660: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1670: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1680: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74  StringObj(SSL_st
1690: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ate_string_long(
16a0: 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ssl), -1));..Tcl
16b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
16c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
16d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
16e0: 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d  ingObj("info", -
16f0: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
1700: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
1710: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
1720: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
1730: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76  (cmdPtr);.    Ev
1740: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
1750: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
1760: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
1770: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
1780: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61  . *. * MessageCa
17e0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
17f0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f  Monitors SSL pro
1800: 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20  tocol messages. 
1810: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
1820: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
1830: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
1840: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
1850: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d  defined). *. *--
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18a0: 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50  -. */.#ifndef OP
18b0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41  ENSSL_NO_SSL_TRA
18c0: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d  CE.static void.M
18d0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69  essageCallback(i
18e0: 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20  nt write_p, int 
18f0: 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e  version, int con
1900: 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74  tent_type, const
1910: 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65   void *buf, size
1920: 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c  _t len, SSL *ssl
1930: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
1940: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1950: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
1960: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
1970: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
1980: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
1990: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
19a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c  ;.    char *ver,
19b0: 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20   *type;.    BIO 
19c0: 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62  *bio;.    char b
19d0: 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20  uffer[15000];.  
19e0: 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b    buffer[0] = 0;
19f0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
1a00: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
1a10: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
1a20: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
1a30: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
1a40: 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76 65 72  ..    switch(ver
1a50: 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e  sion) {.#if OPEN
1a60: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
1a70: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
1a80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
1a90: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
1aa0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
1ab0: 32 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 32  2).    case SSL2
1ac0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1ad0: 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b   "SSLv2";..break
1ae0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
1af0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
1b00: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
1b10: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20  SL_NO_SSL3).    
1b20: 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53 49 4f  case SSL3_VERSIO
1b30: 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 33  N:..ver = "SSLv3
1b40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  ";..break;.#endi
1b50: 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f  f.    case TLS1_
1b60: 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20  VERSION:..ver = 
1b70: 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b  "TLSv1";..break;
1b80: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 31  .    case TLS1_1
1b90: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1ba0: 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65   "TLSv1.1";..bre
1bb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1bc0: 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_2_VERSION:..ve
1bd0: 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09  r = "TLSv1.2";..
1be0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1bf0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a  TLS1_3_VERSION:.
1c00: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 33 22  .ver = "TLSv1.3"
1c10: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1c20: 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f  se 0:..ver = "no
1c30: 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ne";..break;.   
1c40: 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d   default:..ver =
1c50: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65   "unknown";..bre
1c60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ak;.    }..    s
1c70: 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74  witch (content_t
1c80: 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20  ype) {.    case 
1c90: 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a  SSL3_RT_HEADER:.
1ca0: 09 74 79 70 65 20 3d 20 22 48 65 61 64 65 72 22  .type = "Header"
1cb0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1cc0: 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52  se SSL3_RT_INNER
1cd0: 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09  _CONTENT_TYPE:..
1ce0: 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f  type = "Inner Co
1cf0: 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09 62 72  ntent Type";..br
1d00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1d10: 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50  L3_RT_CHANGE_CIP
1d20: 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20  HER_SPEC:..type 
1d30: 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68 65 72  = "Change Cipher
1d40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1d50: 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52  ase SSL3_RT_ALER
1d60: 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72  T:..type = "Aler
1d70: 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  t";..break;.    
1d80: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e  case SSL3_RT_HAN
1d90: 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20  DSHAKE:..type = 
1da0: 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72  "Handshake";..br
1db0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1dc0: 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54 49 4f  L3_RT_APPLICATIO
1dd0: 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20 3d 20  N_DATA:..type = 
1de0: 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62 72 65  "App Data";..bre
1df0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 44 54 4c  ak;.    case DTL
1e00: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a  S1_RT_HEARTBEAT:
1e10: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62  ..type = "Heartb
1e20: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  eat";..break;.  
1e30: 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 70 65    default:..type
1e40: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1e50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64    }..    /* Need
1e60: 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f  s compile time o
1e70: 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73  ption "enable-ss
1e80: 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20  l-trace". */.   
1e90: 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f   if ((bio = BIO_
1ea0: 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
1eb0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  ) != NULL) {..in
1ec0: 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28  t n;..SSL_trace(
1ed0: 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e  write_p, version
1ee0: 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20  , content_type, 
1ef0: 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28  buf, len, ssl, (
1f00: 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20  void *)bio);..n 
1f10: 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20  = BIO_read(bio, 
1f20: 62 75 66 66 65 72 2c 20 6d 69 6e 28 42 49 4f 5f  buffer, min(BIO_
1f30: 70 65 6e 64 69 6e 67 28 62 69 6f 29 2c 20 31 34  pending(bio), 14
1f40: 39 39 39 29 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30  999));..n = (n<0
1f50: 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66  ) ? 0 : n;..buff
1f60: 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69  er[n] = 0;..(voi
1f70: 64 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29  d)BIO_flush(bio)
1f80: 3b 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29  ;..BIO_free(bio)
1f90: 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  ;.   }..    /* C
1fa0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
1fb0: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
1fc0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
1fd0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
1fe0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
1ff0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2000: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2010: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2020: 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61  StringObj("messa
2030: 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ge", -1));.    T
2040: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2050: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2060: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
2070: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
2080: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
2090: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
20a0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
20b0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
20c0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
20d0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
20e0: 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20  ngObj(write_p ? 
20f0: 22 53 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76  "Sent" : "Receiv
2100: 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ed", -1));.    T
2110: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2120: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2130: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
2140: 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31  tringObj(ver, -1
2150: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2160: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2170: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2180: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2190: 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20  j(type, -1));.  
21a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
21b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
21c0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
21d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66  ewStringObj(buff
21e0: 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  er, -1));..    /
21f0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
2200: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
2210: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2220: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
2230: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
2240: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
2250: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
2260: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2270: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a  );.}.#endif.../*
2280: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
22d0: 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  ifyCallback --. 
22e0: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
22f0: 4c 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61  L certificate va
2300: 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lidation process
2310: 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  . Used to contro
2320: 6c 20 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f  l the. *.behavio
2330: 72 20 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56  r when the SSL_V
2340: 45 52 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20  ERIFY_PEER flag 
2350: 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73 20  is set. This is 
2360: 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76  called. *.whenev
2370: 65 72 20 61 20 63 65 72 74 69 66 69 63 61 74 65  er a certificate
2380: 20 69 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72   is inspected or
2390: 20 64 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64   decided invalid
23a0: 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09  . Called for. *.
23b0: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
23c0: 20 69 6e 20 74 68 65 20 63 65 72 74 20 63 68 61   in the cert cha
23d0: 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73  in.. *. * Checks
23e0: 3a 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65  :. *.certificate
23f0: 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65   chain is checke
2400: 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  d starting with 
2410: 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74  the deepest nest
2420: 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28  ing level. *.  (
2430: 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74  the root CA cert
2440: 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72  ificate) and wor
2450: 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68  ked upward to th
2460: 65 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69  e peer's certifi
2470: 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67  cate.. *.All sig
2480: 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69  natures are vali
2490: 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  d, current time 
24a0: 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20  is within first 
24b0: 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74  and last validit
24c0: 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b  y time.. *.Check
24d0: 20 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66   that the certif
24e0: 69 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20  icate is issued 
24f0: 62 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65  by the issuer ce
2500: 72 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72  rtificate issuer
2510: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72  .. *.Check the r
2520: 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73  evocation status
2530: 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66   for each certif
2540: 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20  icate.. *.Check 
2550: 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20  the validity of 
2560: 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e  the given CRL an
2570: 64 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63  d the cert revoc
2580: 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a  ation status.. *
2590: 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63  .Check the polic
25a0: 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63  ies of all the c
25b0: 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20  ertificates. *. 
25c0: 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72  * Args. *.prever
25d0: 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73  ify_ok indicates
25e0: 20 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72   whether the cer
25f0: 74 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63  tificate verific
2600: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29  ation passed (1)
2610: 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20   or not (0). *. 
2620: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
2630: 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74  callback bound t
2640: 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79  o the socket may
2650: 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a   return one of:.
2660: 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65   *.    0...- the
2670: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
2680: 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20  deemed invalid, 
2690: 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f  send verificatio
26a0: 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72  n. *....  failur
26b0: 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c  e alert to peer,
26c0: 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68   and terminate h
26d0: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20  andshake.. *.   
26e0: 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69   1...- the certi
26f0: 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64  ficate is deemed
2700: 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65   valid, continue
2710: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e   with handshake.
2720: 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74  . *.    empty st
2730: 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65  ring.- no change
2740: 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20   to certificate 
2750: 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a  validation. *. *
2760: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
2770: 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20  *.The err field 
2780: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2790: 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65   operative State
27a0: 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20   is set. *.  to 
27b0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
27c0: 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f  ing the SSL nego
27d0: 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  tiation failure 
27e0: 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  reason. *. *----
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2830: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56   */.static int.V
2840: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e  erifyCallback(in
2850: 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45  t ok, X509_STORE
2860: 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20  _CTX *ctx) {.   
2870: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
2880: 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c  ;.    SSL   *ssl
2890: 20 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54   = (SSL*)X509_ST
28a0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64  ORE_CTX_get_ex_d
28b0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74  ata(ctx, SSL_get
28c0: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54  _ex_data_X509_ST
28d0: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a  ORE_CTX_idx());.
28e0: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09      X509  *cert.
28f0: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
2900: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65  X_get_current_ce
2910: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61  rt(ctx);.    Sta
2920: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
2930: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
2940: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20  pp_data(ssl);.  
2950: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2960: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
2970: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74  >interp;.    int
2980: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
2990: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
29a0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
29b0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
29c0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
29d0: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20  _error(ctx);..  
29e0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
29f0: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  d");.    dprintf
2a00: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2a10: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  : %d", ok);..   
2a20: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
2a30: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
2a40: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65  )NULL) {../* Use
2a50: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72   ok value if ver
2a60: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71  ification is req
2a70: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74  uired */..if (st
2a80: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
2a90: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
2aa0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
2ab0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
2ac0: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
2ad0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
2ae0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
2af0: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73  ert == NULL || s
2b00: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
2b10: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
2b20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2b30: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61  ifyCallback: eva
2b40: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20  l callback");.. 
2b50: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
2b60: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
2b70: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2b80: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2b90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
2ba0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2bb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2bc0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2bd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
2be0: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rify", -1));.   
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 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2c20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2c30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
2c40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2c50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2c60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2c80: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2c90: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63  (depth));.    Tc
2ca0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2cb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2cc0: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35  mdPtr, Tls_NewX5
2cd0: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65  09Obj(interp, ce
2ce0: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  rt));.    Tcl_Li
2cf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d00: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2d10: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2d20: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  (ok));.    Tcl_L
2d30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2d40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2d50: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
2d60: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30  ngObj((char*)X50
2d70: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
2d80: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
2d90: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50   -1));..    /* P
2da0: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65  revent I/O while
2db0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20   callback is in 
2dc0: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20  progress */.    
2dd0: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2de0: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41  gs |= TLS_TCL_CA
2df0: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20  LLBACK; */..    
2e00: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
2e10: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
2e20: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2e30: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b  (cmdPtr);.    ok
2e40: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
2e50: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
2e60: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
2e70: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2e80: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70  cmdPtr);..    dp
2e90: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c  rintf("VerifyCal
2ea0: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72  lback: command r
2eb0: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29  esult = %d", ok)
2ec0: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  ;..    /* stateP
2ed0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54  tr->flags &= ~(T
2ee0: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
2ef0: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28  ; */.    return(
2f00: 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75  ok);./* By defau
2f10: 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69  lt, leave verifi
2f20: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  cation unchanged
2f30: 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f  -. *. * Tls_Erro
2f90: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73  r --. *. *.Calls
2fa0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c   callback with l
2fb0: 69 73 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20  ist of errors.. 
2fc0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
2fd0: 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69  s:. *.The err fi
2fe0: 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
2ff0: 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53  ntly operative S
3000: 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20  tate is set. *. 
3010: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73   to a string des
3020: 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20  cribing the SSL 
3030: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c  negotiation fail
3040: 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a  ure reason. *. *
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73  ---. */.void.Tls
30a0: 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74  _Error(State *st
30b0: 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73  atePtr, char *ms
30c0: 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  g) {.    Tcl_Int
30d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
30e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
30f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
3100: 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20  Ptr, *listPtr;. 
3110: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
3120: 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50   err;.    stateP
3130: 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a  tr->err = msg;..
3140: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3150: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3160: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
3170: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
3180: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a  NULL)..return;..
3190: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
31a0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
31b0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
31c0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
31d0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
31e0: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
31f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3200: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3210: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3220: 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b  j("error", -1));
3230: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3240: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3250: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
3260: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
3270: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
3280: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
3290: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
32a0: 20 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c    if (msg != NUL
32b0: 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  L) {..Tcl_ListOb
32c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
32d0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
32e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
32f0: 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  msg, -1));..    
3300: 7d 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20  } else if ((msg 
3310: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
3320: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62  romObj(Tcl_GetOb
3330: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  jResult(interp),
3340: 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55   (Tcl_Size *) NU
3350: 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  LL)) != NULL) {.
3360: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3370: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3380: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3390: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20  wStringObj(msg, 
33a0: 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  -1));..    } els
33b0: 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54  e {..listPtr = T
33c0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
33d0: 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28   NULL);..while (
33e0: 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65  (err = ERR_get_e
33f0: 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a  rror()) != 0) {.
3400: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3410: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3420: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
3430: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3440: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72  ERR_reason_error
3450: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
3460: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74  ));..}..Tcl_List
3470: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3480: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3490: 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d   listPtr);.    }
34a0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
34b0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
34c0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
34d0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
34e0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
34f0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
3500: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
3510: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3520: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
3530: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79  ------. *. * Key
3580: 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  LogCallback --. 
3590: 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69  *. *.Write recei
35a0: 76 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20  ved key data to 
35b0: 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20  log file.. *. * 
35c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
35d0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3620: 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61  */.void KeyLogCa
3630: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
3640: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61   *ssl, const cha
3650: 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63  r *line) {.    c
3660: 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e  har *str = geten
3670: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
3680: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a  ;.    FILE *fd;.
3690: 20 20 20 20 28 76 6f 69 64 20 2a 29 20 73 73 6c      (void *) ssl
36a0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
36b0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
36c0: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20  f (str) {..fd = 
36d0: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b  fopen(str, "a");
36e0: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25  ..fprintf(fd, "%
36f0: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c  s\n",line);..fcl
3700: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d  ose(fd);.    }.}
3710: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3760: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62  * Password Callb
3770: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ack --. *. *.Cal
3780: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77  led when a passw
3790: 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61 74  ord for a privat
37a0: 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74  e key loading/st
37b0: 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63  oring a PEM. *.c
37c0: 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20  ertificate with 
37d0: 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c  encryption. Eval
37e0: 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  s callback scrip
37f0: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a  t and returns. *
3800: 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74  .the result as t
3810: 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69  he password stri
3820: 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a  ng in buf.. *. *
3830: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
3840: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
3850: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
3860: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
3870: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
3880: 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20  ns:. *.Password 
3890: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72  size in bytes or
38a0: 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72   -1 for an error
38b0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
3900: 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f  tatic int.Passwo
3910: 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20  rdCallback(char 
3920: 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20  *buf, int size, 
3930: 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64  int rwflag, void
3940: 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53   *udata) {.    S
3950: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d  tate *statePtr.=
3960: 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61   (State *) udata
3970: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
3980: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
3990: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
39a0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
39b0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  ;.    int code;.
39c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
39d0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
39e0: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20  If no callback, 
39f0: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c  use default call
3a00: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28  back */.    if (
3a10: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3a20: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  rd == NULL) {..i
3a30: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e  f (Tcl_EvalEx(in
3a40: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73  terp, "tls::pass
3a50: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  word", -1, TCL_E
3a60: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54  VAL_GLOBAL) == T
3a70: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
3a80: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
3a90: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
3aa0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
3ab0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
3ac0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
3ad0: 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75  size);..    retu
3ae0: 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72  rn (int)strlen(r
3af0: 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  et);..} else {..
3b00: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09      return -1;..
3b10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
3b20: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3b30: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d  o eval */.    cm
3b40: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3b50: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3b60: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20  ->password);.   
3b70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3b80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3b90: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3ba0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73  wStringObj("pass
3bb0: 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20  word", -1));.   
3bc0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3bd0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3be0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3bf0: 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29  wIntObj(rwflag))
3c00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3c10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3c20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3c30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a  cl_NewIntObj(siz
3c40: 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  e));..    Tcl_Pr
3c50: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
3c60: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
3c70: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
3c80: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
3c90: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  Ptr);..    /* Ev
3ca0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
3cb0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
3cc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
3cd0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
3ce0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
3cf0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
3d00: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
3d10: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
3d20: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
3d30: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
3d40: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
3d50: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
3d60: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
3d70: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
3d80: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
3d90: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
3da0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
3db0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
3dc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3dd0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
3de0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3df0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3e00: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63  ;..    /* If suc
3e10: 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61  cessful, pass ba
3e20: 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 69  ck password stri
3e30: 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20  ng and truncate 
3e40: 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20  if too long */. 
3e50: 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54     if (code == T
3e60: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 69  CL_OK) {..Tcl_Si
3e70: 7a 65 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 72  ze len;..char *r
3e80: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3e90: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3ea0: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3eb0: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65  ult(interp), &le
3ec0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 28  n);..if (len > (
3ed0: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31  Tcl_Size) size-1
3ee0: 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 28  ) {..    len = (
3ef0: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31  Tcl_Size) size-1
3f00: 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 62 75  ;..}..strncpy(bu
3f10: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29  f, ret, (size_t)
3f20: 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d   len);..buf[len]
3f30: 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52 65   = '\0';..Tcl_Re
3f40: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
3f50: 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74  a) interp);..ret
3f60: 75 72 6e 28 28 69 6e 74 29 20 6c 65 6e 29 3b 0a  urn((int) len);.
3f70: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65      }.    Tcl_Re
3f80: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
3f90: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
3fa0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f  return -1;.}.../
3fb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65  -------. *. * Se
4000: 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66  ssion Callback f
4010: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4020: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20  . *.Called when 
4030: 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73  a new session is
4040: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61   added to the ca
4050: 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a  che. In TLS 1.3.
4060: 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72   *.this may be r
4070: 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65  eceived multiple
4080: 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65   times after the
4090: 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a   handshake. For.
40a0: 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69   *.earlier versi
40b0: 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ons, this will b
40c0: 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e  e received durin
40d0: 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  g the handshake.
40e0: 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20  . *.This is the 
40f0: 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f  preferred way to
4100: 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61   obtain a resuma
4110: 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a  ble session.. *.
4120: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
4130: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
4140: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
4150: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
4160: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
4170: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20  urn codes:. *.0 
4180: 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65  = error where se
4190: 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d  ssion will be im
41a0: 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65  mediately remove
41b0: 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  d from the inter
41c0: 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20  nal cache.. *.1 
41d0: 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20  = success where 
41e0: 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73  app retains sess
41f0: 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63  ion in session c
4200: 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63  ache, and must c
4210: 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  all SSL_SESSION_
4220: 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65  free() when done
4230: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4280: 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f  tatic int.Sessio
4290: 6e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  nCallback(const 
42a0: 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45  SSL *ssl, SSL_SE
42b0: 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20  SSION *session) 
42c0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
42d0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
42e0: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
42f0: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20  ((SSL *)ssl);.  
4300: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4310: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
4320: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
4330: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
4340: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
4350: 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20   char *ticket;. 
4360: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4370: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
4380: 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  id;.    size_t l
4390: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  en2;.    unsigne
43a0: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20  d int ulen;..   
43b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
43c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
43d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
43e0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
43f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4400: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
4410: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
4420: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
4430: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4440: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4450: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
4460: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
4470: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
4480: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
4490: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
44a0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
44b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
44c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
44d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
44e0: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20  gObj("session", 
44f0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
4500: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4510: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4520: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
4530: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
4540: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
4550: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
4560: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69  );..    /* Sessi
4570: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73  on id */.    ses
4580: 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
4590: 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
45a0: 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20  sion, &ulen);.  
45b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
45c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
45d0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
45e0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
45f0: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
4600: 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20  Size) ulen));.. 
4610: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69     /* Session ti
4620: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
4630: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
4640: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ket(session, &ti
4650: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20  cket, &len2);.  
4660: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4670: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4680: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4690: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
46a0: 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
46b0: 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f  ) len2));..    /
46c0: 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d  * Lifetime - num
46d0: 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a  ber of seconds *
46e0: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
46f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4700: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4710: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28  Tcl_NewLongObj((
4720: 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f  long) SSL_SESSIO
4730: 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66  N_get_ticket_lif
4740: 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69  etime_hint(sessi
4750: 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  on)));..    /* E
4760: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
4770: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
4780: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
4790: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61  Ptr);.    EvalCa
47a0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
47b0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
47c0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
47d0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
47e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
47f0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4840: 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66   ALPN Callback f
4850: 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e  or Servers and N
4860: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  PN Callback for 
4870: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Clients --. *. *
4880: 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f  .Perform protoco
4890: 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c  l (http/1.1, h2,
48a0: 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63   h3, etc.) selec
48b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09  tion for the. *.
48c0: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74  incoming connect
48d0: 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65  ion. Called afte
48e0: 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76  r Hello and serv
48f0: 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a  er callbacks.. *
4900: 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20  .Where 'out' is 
4910: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
4920: 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68  l and 'in' is th
4930: 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65  e peer advertise
4940: 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65  d list.. *. * Re
4950: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
4960: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
4970: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
4980: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
4990: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
49a0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
49b0: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e  EXT_ERR_OK: ALPN
49c0: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
49d0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
49e0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
49f0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4a00: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65  ALERT_FATAL: The
4a10: 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61  re was no overla
4a20: 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c  p between the cl
4a30: 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75  ient's. *.    su
4a40: 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20  pplied list and 
4a50: 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69  the server confi
4a60: 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f  guration. The co
4a70: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nnection will be
4a80: 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c   aborted.. *.SSL
4a90: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4aa0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  K: ALPN protocol
4ab0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65   not selected, e
4ac0: 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20  .g., because no 
4ad0: 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74  ALPN. *.    prot
4ae0: 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67  ocols are config
4af0: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f  ured for this co
4b00: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f  nnection. The co
4b10: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
4b20: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4b70: 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e  .static int.ALPN
4b80: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
4b90: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75  SL *ssl, const u
4ba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f  nsigned char **o
4bb0: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ut, unsigned cha
4bc0: 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73  r *outlen,..cons
4bd0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4be0: 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  *in, unsigned in
4bf0: 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  t inlen, void *a
4c00: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
4c10: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
4c20: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
4c30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
4c40: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
4c50: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
4c60: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
4c70: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20   code, res;..   
4c80: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
4c90: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c  ");..    if (ssl
4ca0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20   == NULL || arg 
4cb0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4cc0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4cd0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4ce0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72      /* Select pr
4cf0: 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66  otocol */.    if
4d00: 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78   (SSL_select_nex
4d10: 74 5f 70 72 6f 74 6f 28 6f 75 74 2c 20 6f 75 74  t_proto(out, out
4d20: 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  len, statePtr->p
4d30: 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d  rotos, statePtr-
4d40: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e  >protos_len,..in
4d50: 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e  , inlen) == OPEN
4d60: 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54  SSL_NPN_NEGOTIAT
4d70: 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20  ED) {../* Match 
4d80: 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20  found */..res = 
4d90: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4da0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
4db0: 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f  ./* OPENSSL_NPN_
4dc0: 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20  NO_OVERLAP = No 
4dd0: 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20  overlap, so use 
4de0: 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20  first item from 
4df0: 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20  client protocol 
4e00: 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53  list */..res = S
4e10: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4e20: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
4e30: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
4e40: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
4e50: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
4e60: 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  res;.    }..    
4e70: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
4e80: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
4e90: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
4ea0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
4eb0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
4ec0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4ed0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4ee0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
4ef0: 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22  StringObj("alpn"
4f00: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
4f10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4f20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4f30: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
4f40: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
4f50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
4f60: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
4f70: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
4f80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4f90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4fa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4fb0: 62 6a 28 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20  bj(*out, -1));. 
4fc0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4fd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4fe0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4ff0: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65  NewBooleanObj(re
5000: 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  s == SSL_TLSEXT_
5010: 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f  ERR_OK));..    /
5020: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
5030: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
5040: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5050: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20  cmdPtr);.    if 
5060: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c  ((code = EvalCal
5070: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
5080: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29  atePtr, cmdPtr))
5090: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53   > 1) {..res = S
50a0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
50b0: 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ACK;.    } else 
50c0: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
50d0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
50e0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
50f0: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
5100: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5110: 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d  ERT_FATAL;.    }
5120: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5130: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5140: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
5150: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
51a0: 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f 74  * Advertise Prot
51b0: 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66  ocols Callback f
51c0: 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c  or Next Protocol
51d0: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50   Negotiation (NP
51e0: 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c  N) in ServerHell
51f0: 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65  o --. *. *.calle
5200: 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72  d when a TLS ser
5210: 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74  ver needs a list
5220: 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 72   of supported pr
5230: 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74  otocols for Next
5240: 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67  . *.Protocol Neg
5250: 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  otiation.. *. * 
5260: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
5270: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5280: 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72  cts:. *. * Retur
5290: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
52a0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e  TLSEXT_ERR_OK: N
52b0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  PN protocol sele
52c0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
52d0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
52e0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
52f0: 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f  R_NOACK: NPN pro
5300: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
5310: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5320: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5330: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65  ------. */.#ifde
5380: 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63  f USE_NPN.static
5390: 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b   int.NPNCallback
53a0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
53b0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
53c0: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
53d0: 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e  gned int *outlen
53e0: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
53f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
5400: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
5410: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
5420: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
5430: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c  f (ssl == NULL |
5440: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | arg == NULL) {
5450: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5460: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
5470: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
5480: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
5490: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
54a0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
54b0: 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73  ULL) {..*out = s
54c0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b  tatePtr->protos;
54d0: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74  ..*outlen = stat
54e0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
54f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5500: 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f  *out = NULL;..*o
5510: 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75  utlen = 0;..retu
5520: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5530: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20  R_NOACK;.    }. 
5540: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c     return SSL_TL
5550: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23  SEXT_ERR_OK;.}.#
5560: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  endif.../*. *---
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62  . *. * SNI Callb
55c0: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
55d0: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
55e0: 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49   server-side SNI
55f0: 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74   hostname select
5600: 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 76  ion after receiv
5610: 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  ing SNI extensio
5620: 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48  n. *.in Client H
5630: 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74  ello. Called aft
5640: 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63  er hello callbac
5650: 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50  k but before ALP
5660: 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  N callback.. *. 
5670: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
5680: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
5690: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
56a0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
56b0: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
56c0: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
56d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
56e0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
56f0: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f  accepted. The co
5700: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5710: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5720: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
5730: 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  L: SNI hostname 
5740: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e  is not accepted.
5750: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   The connection.
5760: 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65   *.    is aborte
5770: 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61  d. Default for a
5780: 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55  lert is SSL_AD_U
5790: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45  NRECOGNIZED_NAME
57a0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
57b0: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
57c0: 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  G: SNI hostname 
57d0: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c  is not accepted,
57e0: 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20   warning alert. 
57f0: 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20  *.    sent (not 
5800: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53  supported in TLS
5810: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65  v1.3). The conne
5820: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5830: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5840: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f  RR_NOACK: SNI ho
5850: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5860: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61  cepted and not a
5870: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09  cknowledged,. *.
5880: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20      e.g. if SNI 
5890: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e  has not been con
58a0: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e  figured. The con
58b0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
58c0: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
5910: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61  static int.SNICa
5920: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
5930: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
5940: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
5950: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
5960: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
5970: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
5980: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
5990: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
59a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
59b0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
59c0: 20 72 65 73 3b 0a 20 20 20 20 63 68 61 72 20 2a   res;.    char *
59d0: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c  servername = NUL
59e0: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  L;..    dprintf(
59f0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5a00: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5a10: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5a20: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5a30: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5a40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
5a50: 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53  ly works for TLS
5a60: 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72   1.2 and earlier
5a70: 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61   */.    serverna
5a80: 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72  me = SSL_get_ser
5a90: 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
5aa0: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
5ab0: 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20  t_name);.    if 
5ac0: 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20  (!servername || 
5ad0: 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d  servername[0] ==
5ae0: 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e   '\0') {..return
5af0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5b00: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5b10: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
5b20: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
5b30: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
5b40: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5b50: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
5b60: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
5b70: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
5b80: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
5b90: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
5ba0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
5bb0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5bc0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5bd0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5be0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c  StringObj("sni",
5bf0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5c00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5c10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5c20: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
5c30: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
5c40: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
5c50: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
5c60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5c70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5c80: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5c90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5ca0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d  j(servername , -
5cb0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
5cc0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
5cd0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
5ce0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5cf0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
5d00: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
5d10: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
5d20: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
5d30: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5d40: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57  SEXT_ERR_ALERT_W
5d50: 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20  ARNING;..*alert 
5d60: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  = SSL_AD_UNRECOG
5d70: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e  NIZED_NAME; /* N
5d80: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
5d90: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d  TLS 1.3 */.    }
5da0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
5db0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
5dc0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5dd0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
5de0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5df0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
5e00: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41  ..*alert = SSL_A
5e10: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5e20: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70  AME; /* Not supp
5e30: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33  orted by TLS 1.3
5e40: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   */.    }.    Tc
5e50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
5e60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
5e70: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
5e80: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ec0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e  ----. *. * Clien
5ed0: 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65  tHello Handshake
5ee0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
5ef0: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55  rvers --. *. *.U
5f00: 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f  sed by server to
5f10: 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72   examine the ser
5f20: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74  ver name indicat
5f30: 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73  ion (SNI) extens
5f40: 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20  ion. *.provided 
5f50: 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e  by the client in
5f60: 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74   order to select
5f70: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
5f80: 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20  certificate to. 
5f90: 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d  *.present, and m
5fa0: 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67  ake other config
5fb0: 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65  uration adjustme
5fc0: 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20  nts relevant to 
5fd0: 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e  that server. *.n
5fe0: 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66  ame and its conf
5ff0: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iguration. This 
6000: 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e  includes swappin
6010: 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69  g out the associ
6020: 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20  ated. *.SSL_CTX 
6030: 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69  pointer, modifyi
6040: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20  ng the server's 
6050: 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65  list of permitte
6060: 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a  d TLS versions,.
6070: 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20   *.changing the 
6080: 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 20  server's cipher 
6090: 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65  list in response
60a0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73   to the client's
60b0: 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74   cipher list, et
60c0: 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66  c.. *.Called bef
60d0: 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e  ore SNI and ALPN
60e0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20   callbacks.. *. 
60f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
6100: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
6110: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
6120: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
6130: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
6140: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
6150: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
6160: 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65  TRY: suspend the
6170: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20   handshake, and 
6180: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75  the handshake fu
6190: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75  nction will retu
61a0: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20  rn immediately. 
61b0: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
61c0: 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72  LO_ERROR: failur
61d0: 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e  e, terminate con
61e0: 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65  nection. Set ale
61f0: 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65  rt to error code
6200: 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  .. *.SSL_CLIENT_
6210: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73  HELLO_SUCCESS: s
6220: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d  uccess. *. *----
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6270: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48   */.static int.H
6280: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  elloCallback(con
6290: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
62a0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
62b0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
62c0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
62d0: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
62e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
62f0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
6300: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
6310: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
6320: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20   code, res;.    
6330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76  const char *serv
6340: 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  ername;.    cons
6350: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6360: 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  *p;.    size_t l
6370: 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a  en, remaining;..
6380: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6390: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
63a0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
63b0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
63c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
63d0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
63e0: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
63f0: 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e   if (ssl == (con
6400: 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c  st SSL *)NULL ||
6410: 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29   arg == (void *)
6420: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
6430: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6440: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6450: 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20     /* Get names 
6460: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
6470: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74  client_hello_get
6480: 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58  0_ext(ssl, TLSEX
6490: 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61  T_TYPE_server_na
64a0: 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69  me, &p, &remaini
64b0: 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67  ng) || remaining
64c0: 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74   <= 2) {..*alert
64d0: 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41   = SSL_R_SSLV3_A
64e0: 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52  LERT_ILLEGAL_PAR
64f0: 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20  AMETER;..return 
6500: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6520: 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
6530: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
6540: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66  supplied list of
6550: 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c   names. */.    l
6560: 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20  en = (*(p++) << 
6570: 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a  8);.    len += *
6580: 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c  (p++);.    if (l
6590: 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e  en + 2 != remain
65a0: 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  ing) {..*alert =
65b0: 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45   SSL_R_SSLV3_ALE
65c0: 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d  RT_ILLEGAL_PARAM
65d0: 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  ETER;..return SS
65e0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
65f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6600: 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b  remaining = len;
6610: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73  ..    /* The lis
6620: 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e  t in practice on
6630: 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20  ly has a single 
6640: 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f  element, so we o
6650: 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65  nly consider the
6660: 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20   first one. */. 
6670: 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67     if (remaining
6680: 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d   == 0 || *p++ !=
6690: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
66a0: 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a  _host_name) {..*
66b0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
66c0: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
66d0: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
66e0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
66f0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6700: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b      remaining--;
6710: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20  ..    /* Now we 
6720: 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c  can finally pull
6730: 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 72   out the byte ar
6740: 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63 74  ray with the act
6750: 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f  ual hostname. */
6760: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69  .    if (remaini
6770: 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65  ng <= 2) {..*ale
6780: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6790: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
67a0: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
67b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
67c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
67d0: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c   len = (*(p++) <
67e0: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d  < 8);.    len +=
67f0: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20   *(p++);.    if 
6800: 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69  (len + 2 > remai
6810: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20  ning) {..*alert 
6820: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6830: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6840: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6850: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6860: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
6870: 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20  maining = len;. 
6880: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20     servername = 
6890: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b  (const char *)p;
68a0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
68b0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
68c0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
68d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
68e0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
68f0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6900: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6910: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
6920: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6930: 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20  "hello", -1));. 
6940: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6950: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6960: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
6970: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6980: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
6990: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
69a0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
69b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
69c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
69d0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
69e0: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72  StringObj(server
69f0: 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29  name, (Tcl_Size)
6a00: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   len));..    /* 
6a10: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
6a20: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
6a30: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
6a40: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
6a50: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
6a60: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
6a70: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
6a80: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6a90: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
6aa0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TRY;..*alert = S
6ab0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6ac0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b  _USER_CANCELLED;
6ad0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6ae0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
6af0: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
6b00: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20  ELLO_SUCCESS;.  
6b10: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
6b20: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6b30: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72  LO_ERROR;..*aler
6b40: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6b50: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6b60: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6b70: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6b80: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
6b90: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
6ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6bb0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73  ***/./* Commands
6bc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
6bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6be0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
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 0a 20 2a 0a  ------------. *.
6c30: 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43   * HandshakeObjC
6c40: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
6c50: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
6c60: 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74 68   to verify wheth
6c70: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  er the handshake
6c80: 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09   is complete. *.
6c90: 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65  or not.. *. * Re
6ca0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
6cb0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
6cc0: 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61   1 means handsha
6cd0: 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d  ke complete, 0 m
6ce0: 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a  eans pending.. *
6cf0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6d00: 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53  :. *.May force S
6d10: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74  SL negotiation t
6d20: 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a  o take place.. *
6d30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
6d80: 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f  c int HandshakeO
6d90: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
6da0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
6db0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6dc0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
6dd0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
6de0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
6df0: 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20  nel chan;       
6e00: 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20   /* The channel 
6e10: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
6e20: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
6e30: 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20  statePtr;       
6e40: 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65   /* client state
6e50: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
6e60: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
6e70: 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c  r *errStr = NULL
6e80: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20  ;.    int ret = 
6e90: 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  1;.    int err =
6ea0: 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63   0;.    (void) c
6eb0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
6ec0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6ed0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
6ee0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
6ef0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
6f00: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
6f10: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28  nnel");..return(
6f20: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
6f30: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
6f40: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
6f50: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
6f60: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
6f70: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6f80: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f  j(objv[1], (Tcl_
6f90: 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c 20 4e  Size *) NULL), N
6fa0: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
6fb0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
6fc0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
6fd0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
6fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
6ff0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
7000: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
7010: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
7020: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
7030: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
7040: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
7050: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
7060: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
7070: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
7080: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7090: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
70a0: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
70b0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
70c0: 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20  .    "\": not a 
70d0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
70e0: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
70f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
7100: 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45  TLS", "HANDSHAKE
7110: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
7120: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
7130: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
7140: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
7150: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
7160: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
7170: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
7180: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
7190: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69    dprintf("Calli
71a0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
71b0: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74  nnect");.    ret
71c0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   = Tls_WaitForCo
71d0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20  nnect(statePtr, 
71e0: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70  &err, 1);.    dp
71f0: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46  rintf("Tls_WaitF
7200: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e  orConnect return
7210: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a  ed: %i", ret);..
7220: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20      if (ret < 0 
7230: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66  && ((statePtr->f
7240: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41  lags & TLS_TCL_A
7250: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d  SYNC) && (err ==
7260: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70   EAGAIN))) {..dp
7270: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74  rintf("Async set
7280: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49   and err = EAGAI
7290: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20  N");..ret = 0;. 
72a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65     } else if (re
72b0: 74 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72  t < 0) {..errStr
72c0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72   = statePtr->err
72d0: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75  ;..Tcl_ResetResu
72e0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c  lt(interp);..Tcl
72f0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a  _SetErrno(err);.
7300: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c  ..if (!errStr ||
7310: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29   (*errStr == 0))
7320: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d   {..    errStr =
7330: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28   Tcl_PosixError(
7340: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63  interp);..}...Tc
7350: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7360: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b  nterp, "handshak
7370: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72  e failed: ", err
7380: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  Str, (char *) NU
7390: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
73a0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
73b0: 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45  TLS", "HANDSHAKE
73c0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
73d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70  ar *) NULL);..dp
73e0: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
73f0: 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20   TCL_ERROR with 
7400: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
7410: 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a  : %s", errStr);.
7420: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
7430: 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  R);.    } else {
7440: 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20  ..if (err != 0) 
7450: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
7460: 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74  Got an error wit
7470: 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61  h a completed ha
7480: 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25  ndshake: err = %
7490: 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65  i", err);..}..re
74a0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
74b0: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
74c0: 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68  ning TCL_OK with
74d0: 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72   data \"%i\"", r
74e0: 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  et);.    Tcl_Set
74f0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
7500: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
7510: 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ret));.    retur
7520: 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(TCL_OK);.}..st
7530: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7540: 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 5b 5d  *command_opts []
7550: 20 3d 20 7b 0a 20 20 20 20 22 2d 61 6c 70 6e 22   = {.    "-alpn"
7560: 2c 20 22 2d 63 61 64 69 72 22 2c 20 22 2d 63 61  , "-cadir", "-ca
7570: 66 69 6c 65 22 2c 20 22 2d 63 65 72 74 22 2c 20  file", "-cert", 
7580: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 22 2d 63  "-certfile", "-c
7590: 69 70 68 65 72 22 2c 20 22 2d 63 69 70 68 65 72  ipher", "-cipher
75a0: 73 22 2c 20 22 2d 63 69 70 68 65 72 73 75 69 74  s", "-ciphersuit
75b0: 65 73 22 2c 0a 20 20 20 20 22 2d 63 6f 6d 6d 61  es",.    "-comma
75c0: 6e 64 22 2c 20 22 2d 64 68 70 61 72 61 6d 73 22  nd", "-dhparams"
75d0: 2c 20 22 2d 6b 65 79 22 2c 20 22 2d 6b 65 79 66  , "-key", "-keyf
75e0: 69 6c 65 22 2c 20 22 2d 6d 6f 64 65 6c 22 2c 20  ile", "-model", 
75f0: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 22 2d 70  "-password", "-p
7600: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 0a  ost_handshake",.
7610: 20 20 20 20 22 2d 72 65 71 75 65 73 74 22 2c 20      "-request", 
7620: 22 2d 72 65 71 75 69 72 65 22 2c 20 22 2d 73 65  "-require", "-se
7630: 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 22  curity_level", "
7640: 2d 73 65 72 76 65 72 22 2c 20 22 2d 73 65 72 76  -server", "-serv
7650: 65 72 6e 61 6d 65 22 2c 20 22 2d 73 65 73 73 69  ername", "-sessi
7660: 6f 6e 5f 69 64 22 2c 20 22 2d 73 73 6c 32 22 2c  on_id", "-ssl2",
7670: 0a 20 20 20 20 22 2d 73 73 6c 33 22 2c 20 22 2d  .    "-ssl3", "-
7680: 74 6c 73 31 22 2c 20 22 2d 74 6c 73 31 2e 31 22  tls1", "-tls1.1"
7690: 2c 20 22 2d 74 6c 73 31 2e 32 22 2c 20 22 2d 74  , "-tls1.2", "-t
76a0: 6c 73 31 2e 33 22 2c 20 22 2d 76 61 6c 69 64 61  ls1.3", "-valida
76b0: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 76 63  tecommand", "-vc
76c0: 6d 64 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75  md", NULL};..enu
76d0: 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20  m _command_opts 
76e0: 7b 0a 20 20 20 20 5f 6f 70 74 5f 61 6c 70 6e 2c  {.    _opt_alpn,
76f0: 20 5f 6f 70 74 5f 63 61 64 69 72 2c 20 5f 6f 70   _opt_cadir, _op
7700: 74 5f 63 61 66 69 6c 65 2c 20 5f 6f 70 74 5f 63  t_cafile, _opt_c
7710: 65 72 74 2c 20 5f 6f 70 74 5f 63 65 72 74 66 69  ert, _opt_certfi
7720: 6c 65 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72 2c  le, _opt_cipher,
7730: 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 2c 0a 20   _opt_ciphers,. 
7740: 20 20 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 75     _opt_ciphersu
7750: 69 74 65 2c 20 5f 6f 70 74 5f 63 6d 64 2c 20 5f  ite, _opt_cmd, _
7760: 6f 70 74 5f 64 68 70 61 72 61 6d 73 2c 20 5f 6f  opt_dhparams, _o
7770: 70 74 5f 6b 65 79 2c 20 5f 6f 70 74 5f 6b 65 79  pt_key, _opt_key
7780: 66 69 6c 65 2c 20 5f 6f 70 74 5f 6d 6f 64 65 6c  file, _opt_model
7790: 2c 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 2c  , _opt_password,
77a0: 0a 20 20 20 20 5f 6f 70 74 5f 68 61 6e 64 73 68  .    _opt_handsh
77b0: 61 6b 65 2c 20 5f 6f 70 74 5f 72 65 71 75 65 73  ake, _opt_reques
77c0: 74 2c 20 5f 6f 70 74 5f 72 65 71 75 69 72 65 2c  t, _opt_require,
77d0: 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 5f 6c   _opt_security_l
77e0: 65 76 65 6c 2c 20 5f 6f 70 74 5f 73 65 72 76 65  evel, _opt_serve
77f0: 72 2c 20 5f 6f 70 74 5f 73 65 72 76 65 72 6e 61  r, _opt_serverna
7800: 6d 65 2c 0a 20 20 20 20 5f 6f 70 74 5f 73 65 73  me,.    _opt_ses
7810: 73 69 6f 6e 5f 69 64 2c 20 5f 6f 70 74 5f 73 73  sion_id, _opt_ss
7820: 6c 32 2c 20 5f 6f 70 74 5f 73 73 6c 33 2c 20 5f  l2, _opt_ssl3, _
7830: 6f 70 74 5f 74 6c 73 31 2c 20 5f 6f 70 74 5f 74  opt_tls1, _opt_t
7840: 6c 73 31 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 32  ls11, _opt_tls12
7850: 2c 20 5f 6f 70 74 5f 74 6c 73 31 33 2c 0a 20 20  , _opt_tls13,.  
7860: 20 20 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65 2c    _opt_validate,
7870: 20 5f 6f 70 74 5f 76 63 6d 64 0a 7d 3b 0a 0a 2f   _opt_vcmd.};../
7880: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
78d0: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
78e0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
78f0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
7900: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
7910: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
7920: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
7930: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
7940: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
7950: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
7960: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
7970: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
7980: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
7990: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
79a0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
79b0: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
79c0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
7a20: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
7a30: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
7a40: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
7a50: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
7a60: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
7a70: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
7a80: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
7a90: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
7aa0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
7ab0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
7ac0: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
7ad0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
7ae0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
7af0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
7b00: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7b10: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
7b20: 64 4f 62 6a 09 20 20 20 20 20 20 20 20 3d 20 4e  dObj.        = N
7b30: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
7b40: 20 2a 70 61 73 73 77 64 4f 62 6a 09 20 20 20 20   *passwdObj.    
7b50: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
7b60: 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20  Tcl_Obj *vcmd.  
7b70: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7b80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
7b90: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
7ba0: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
7bb0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
7bc0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
7bd0: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
7be0: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
7bf0: 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  idx;.    Tcl_Siz
7c00: 65 20 66 6e 2c 20 6c 65 6e 3b 0a 20 20 20 20 69  e fn, len;.    i
7c10: 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 20  nt flags..      
7c20: 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54    = TLS_TCL_INIT
7c30: 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72  ;.    int server
7c40: 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 2f  ..        = 0;./
7c50: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * is connection 
7c60: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67  incoming or outg
7c70: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61  oing? */.    cha
7c80: 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 20  r *keyfile.     
7c90: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
7ca0: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 20  har *certfile.  
7cb0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7cc0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7cd0: 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20  *key  .= NULL;. 
7ce0: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f     Tcl_Size key_
7cf0: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  len             
7d00: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73      = 0;.    uns
7d10: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
7d20: 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b           = NULL;
7d30: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65  .    Tcl_Size ce
7d40: 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20  rt_len          
7d50: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63        = 0;.    c
7d60: 68 61 72 20 2a 63 69 70 68 65 72 73 09 20 20 20  har *ciphers.   
7d70: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
7d80: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
7d90: 74 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  tes.        = NU
7da0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
7db0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
7dc0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
7dd0: 41 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20  Adir..        = 
7de0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
7df0: 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20  DHparams.       
7e00: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
7e10: 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20  r *model..      
7e20: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
7e30: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20  ar *servername. 
7e40: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f         = NULL;./
7e50: 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53  * hostname for S
7e60: 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63  erver Name Indic
7e70: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ation */.    con
7e80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7e90: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e   *session_id = N
7ea0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  ULL;.    Tcl_Siz
7eb0: 65 20 73 65 73 73 5f 6c 65 6e 20 20 20 20 20 20  e sess_len      
7ec0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20            = 0;. 
7ed0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e     Tcl_Obj *alpn
7ee0: 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Obj..= NULL;.   
7ef0: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73   int ssl2 = 0, s
7f00: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sl3 = 0;.    int
7f10: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f   tls1 = 1, tls1_
7f20: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20  1 = 1, tls1_2 = 
7f30: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20  1, tls1_3 = 1;. 
7f40: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30     int proto = 0
7f50: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20  , level = -1;.  
7f60: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30    int verify = 0
7f70: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72  , require = 0, r
7f80: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74  equest = 1, post
7f90: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a  _handshake = 0;.
7fa0: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
7fb0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
7fc0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
7fd0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7fe0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
7ff0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
8000: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23  .    tls1 = 0;.#
8010: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
8020: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
8030: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8040: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74  NO_TLS1_1).    t
8050: 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_1 = 0;.#endi
8060: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
8070: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
8080: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8090: 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_2).    tls1_
80a0: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 0;.#endif.#i
80b0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
80c0: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
80d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
80e0: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20  3).    tls1_3 = 
80f0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  0;.#endif..    i
8100: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
8110: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8120: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
8130: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69  , "channel ?opti
8140: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ons?");..return 
8150: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8160: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8170: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
8180: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
8190: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
81a0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
81b0: 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53  (objv[1], (Tcl_S
81c0: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55  ize *) NULL), NU
81d0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
81e0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
81f0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
8200: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8210: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
8220: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
8230: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
8240: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
8250: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
8260: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
8270: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32      for (idx = 2
8280: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
8290: 78 2b 2b 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f  x++) {..if (Tcl_
82a0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
82b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78  interp, objv[idx
82c0: 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 2c  ], command_opts,
82d0: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 66   "option", 0, &f
82e0: 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  n) != TCL_OK) {.
82f0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8300: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 56  ERROR;..}.../* V
8310: 61 6c 69 64 61 74 65 20 61 72 67 20 68 61 73 20  alidate arg has 
8320: 76 61 6c 75 65 20 2a 2f 0a 09 69 66 20 28 2b 2b  value */..if (++
8330: 69 64 78 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09  idx >= objc) {..
8340: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8350: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f  sult(interp, "No
8360: 20 76 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f   value for optio
8370: 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  n \"", command_o
8380: 70 74 73 5b 66 6e 5d 2c 20 22 5c 22 22 2c 20 28  pts[fn], "\"", (
8390: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
83a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
83b0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  RROR;..}...switc
83c0: 68 28 66 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f  h(fn) {..case _o
83d0: 70 74 5f 61 6c 70 6e 3a 0a 09 20 20 20 20 61 6c  pt_alpn:..    al
83e0: 70 6e 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78  pnObj = objv[idx
83f0: 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ];..    break;..
8400: 63 61 73 65 20 5f 6f 70 74 5f 63 61 64 69 72 3a  case _opt_cadir:
8410: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
8420: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
8430: 43 41 64 69 72 2c 20 4e 55 4c 4c 29 3b 0a 09 20  CAdir, NULL);.. 
8440: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8450: 5f 6f 70 74 5f 63 61 66 69 6c 65 3a 0a 09 20 20  _opt_cafile:..  
8460: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
8470: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 66 69  (objv[idx], CAfi
8480: 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  le, NULL);..    
8490: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
84a0: 74 5f 63 65 72 74 3a 0a 09 20 20 20 20 47 45 54  t_cert:..    GET
84b0: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28  _OPT_BYTE_ARRAY(
84c0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 65 72 74 2c  objv[idx], cert,
84d0: 20 26 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 20 20   &cert_len);..  
84e0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
84f0: 6f 70 74 5f 63 65 72 74 66 69 6c 65 3a 0a 09 20  opt_certfile:.. 
8500: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
8510: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 65 72  G(objv[idx], cer
8520: 74 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20  tfile, NULL);.. 
8530: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8540: 5f 6f 70 74 5f 63 69 70 68 65 72 3a 0a 09 63 61  _opt_cipher:..ca
8550: 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 3a  se _opt_ciphers:
8560: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
8570: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
8580: 63 69 70 68 65 72 73 2c 20 4e 55 4c 4c 29 3b 0a  ciphers, NULL);.
8590: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
85a0: 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 75 69  e _opt_ciphersui
85b0: 74 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  te:..    GET_OPT
85c0: 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78  _STRING(objv[idx
85d0: 5d 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c  ], ciphersuites,
85e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
85f0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  ak;..case _opt_c
8600: 6d 64 3a 0a 09 20 20 20 20 63 6d 64 4f 62 6a 20  md:..    cmdObj 
8610: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
8620: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8630: 6f 70 74 5f 64 68 70 61 72 61 6d 73 3a 0a 09 20  opt_dhparams:.. 
8640: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
8650: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 44 48 70  G(objv[idx], DHp
8660: 61 72 61 6d 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20  arams, NULL);.. 
8670: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8680: 5f 6f 70 74 5f 6b 65 79 3a 0a 09 20 20 20 20 47  _opt_key:..    G
8690: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41  ET_OPT_BYTE_ARRA
86a0: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6b 65 79  Y(objv[idx], key
86b0: 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 20 20  , &key_len);..  
86c0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
86d0: 6f 70 74 5f 6b 65 79 66 69 6c 65 3a 0a 09 20 20  opt_keyfile:..  
86e0: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
86f0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6b 65 79 66  (objv[idx], keyf
8700: 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ile, NULL);..   
8710: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8720: 70 74 5f 6d 6f 64 65 6c 3a 0a 09 20 20 20 20 47  pt_model:..    G
8730: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
8740: 6a 76 5b 69 64 78 5d 2c 20 6d 6f 64 65 6c 2c 20  jv[idx], model, 
8750: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
8760: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61  k;..case _opt_pa
8770: 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 70 61 73  ssword:..    pas
8780: 73 77 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64  swdObj = objv[id
8790: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  x];..    break;.
87a0: 09 63 61 73 65 20 5f 6f 70 74 5f 68 61 6e 64 73  .case _opt_hands
87b0: 68 61 6b 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f  hake:..    GET_O
87c0: 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78  PT_BOOL(objv[idx
87d0: 5d 2c 20 26 70 6f 73 74 5f 68 61 6e 64 73 68 61  ], &post_handsha
87e0: 6b 65 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  ke);..    break;
87f0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72 65 71 75  ..case _opt_requ
8800: 65 73 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  est:..    GET_OP
8810: 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d  T_BOOL(objv[idx]
8820: 2c 20 26 72 65 71 75 65 73 74 29 3b 0a 09 20 20  , &request);..  
8830: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8840: 6f 70 74 5f 72 65 71 75 69 72 65 3a 0a 09 20 20  opt_require:..  
8850: 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f    GET_OPT_BOOL(o
8860: 62 6a 76 5b 69 64 78 5d 2c 20 26 72 65 71 75 69  bjv[idx], &requi
8870: 72 65 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  re);..    break;
8880: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65 63 75  ..case _opt_secu
8890: 72 69 74 79 5f 6c 65 76 65 6c 3a 0a 09 20 20 20  rity_level:..   
88a0: 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a   GET_OPT_INT(obj
88b0: 76 5b 69 64 78 5d 2c 20 26 6c 65 76 65 6c 29 3b  v[idx], &level);
88c0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
88d0: 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72 3a 0a  se _opt_server:.
88e0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f  .    GET_OPT_BOO
88f0: 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 73 65  L(objv[idx], &se
8900: 72 76 65 72 29 3b 0a 09 20 20 20 20 62 72 65 61  rver);..    brea
8910: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65  k;..case _opt_se
8920: 72 76 65 72 6e 61 6d 65 3a 0a 09 20 20 20 20 47  rvername:..    G
8930: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
8940: 6a 76 5b 69 64 78 5d 2c 20 73 65 72 76 65 72 6e  jv[idx], servern
8950: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ame, NULL);..   
8960: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8970: 70 74 5f 73 65 73 73 69 6f 6e 5f 69 64 3a 0a 09  pt_session_id:..
8980: 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45      GET_OPT_BYTE
8990: 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d  _ARRAY(objv[idx]
89a0: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 26 73  , session_id, &s
89b0: 65 73 73 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62  ess_len);..    b
89c0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
89d0: 5f 73 73 6c 32 3a 0a 09 20 20 20 20 47 45 54 5f  _ssl2:..    GET_
89e0: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
89f0: 5d 2c 20 26 73 73 6c 32 29 3b 0a 09 20 20 20 20  ], &ssl2);..    
8a00: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8a10: 74 5f 73 73 6c 33 3a 0a 09 20 20 20 20 47 45 54  t_ssl3:..    GET
8a20: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
8a30: 78 5d 2c 20 26 73 73 6c 33 29 3b 0a 09 20 20 20  x], &ssl3);..   
8a40: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8a50: 70 74 5f 74 6c 73 31 3a 0a 09 20 20 20 20 47 45  pt_tls1:..    GE
8a60: 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69  T_OPT_INT(objv[i
8a70: 64 78 5d 2c 20 26 74 6c 73 31 29 3b 0a 09 20 20  dx], &tls1);..  
8a80: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8a90: 6f 70 74 5f 74 6c 73 31 31 3a 0a 09 20 20 20 20  opt_tls11:..    
8aa0: 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76  GET_OPT_INT(objv
8ab0: 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f 31 29 3b  [idx], &tls1_1);
8ac0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8ad0: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 32 3a 0a 09  se _opt_tls12:..
8ae0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
8af0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31  objv[idx], &tls1
8b00: 5f 32 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  _2);..    break;
8b10: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31  ..case _opt_tls1
8b20: 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  3:..    GET_OPT_
8b30: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8b40: 74 6c 73 31 5f 33 29 3b 0a 09 20 20 20 20 62 72  tls1_3);..    br
8b50: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8b60: 76 61 6c 69 64 61 74 65 3a 0a 09 63 61 73 65 20  validate:..case 
8b70: 5f 6f 70 74 5f 76 63 6d 64 3a 0a 09 20 20 20 20  _opt_vcmd:..    
8b80: 76 63 6d 64 20 3d 20 6f 62 6a 76 5b 69 64 78 5d  vcmd = objv[idx]
8b90: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
8ba0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
8bb0: 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79  request)..verify
8bc0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
8bd0: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
8be0: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
8bf0: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
8c00: 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79   require).verify
8c10: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
8c20: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
8c30: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71  ERT;.    if (req
8c40: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
8c50: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c  dshake).verify |
8c60: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  = SSL_VERIFY_POS
8c70: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20  T_HANDSHAKE;.   
8c80: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30   if (verify == 0
8c90: 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f  )..verify = SSL_
8ca0: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20  VERIFY_NONE;..  
8cb0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32    proto |= (ssl2
8cc0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
8cd0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8ce0: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53  o |= (ssl3 ? TLS
8cf0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29  _PROTO_SSL3 : 0)
8d00: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
8d10: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  tls1 ? TLS_PROTO
8d20: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20  _TLS1 : 0);.    
8d30: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31  proto |= (tls1_1
8d40: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8d50: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_1 : 0);.    pr
8d60: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f  oto |= (tls1_2 ?
8d70: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
8d80: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8d90: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54  o |= (tls1_3 ? T
8da0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20  LS_PROTO_TLS1_3 
8db0: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  : 0);..    /* re
8dc0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62  set to NULL if b
8dd0: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76  lank string prov
8de0: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  ided */.    if (
8df0: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09  cert && !*cert).
8e00: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20  .        cert.  
8e10: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8e20: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b    if (key && !*k
8e30: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79  ey)..        key
8e40: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8e50: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
8e60: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29  e && !*certfile)
8e70: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c           certfil
8e80: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  e.= NULL;.    if
8e90: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b   (keyfile && !*k
8ea0: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65  eyfile)..keyfile
8eb0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
8ec0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
8ed0: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20   && !*ciphers). 
8ee0: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20         ciphers. 
8ef0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
8f00: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69     if (ciphersui
8f10: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73  tes && !*ciphers
8f20: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69  uites) ciphersui
8f30: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20  tes    = NULL;. 
8f40: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26     if (CAfile &&
8f50: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20   !*CAfile).     
8f60: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20     CAfile.      
8f70: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
8f80: 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41 64   (CAdir && !*CAd
8f90: 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64 69  ir).        CAdi
8fa0: 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  r.        = NULL
8fb0: 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  ;.    if (DHpara
8fc0: 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73  ms && !*DHparams
8fd0: 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61  ).        DHpara
8fe0: 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  ms        = NULL
8ff0: 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53  ;..    /* new SS
9000: 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73  L state */.    s
9010: 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74  tatePtr..= (Stat
9020: 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e  e *) ckalloc((un
9030: 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53  signed) sizeof(S
9040: 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73  tate));.    mems
9050: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20  et(statePtr, 0, 
9060: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
9070: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
9080: 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20  lags.= flags;.  
9090: 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65    statePtr->inte
90a0: 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp.= interp;.   
90b0: 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67   statePtr->vflag
90c0: 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20  s.= verify;.    
90d0: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20  statePtr->err.= 
90e0: 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f  "";..    /* allo
90f0: 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20  cate script */. 
9100: 20 20 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d     if (cmdObj !=
9110: 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29   NULL) {..(void)
9120: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9130: 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 26 6c  omObj(cmdObj, &l
9140: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
9150: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
9160: 63 61 6c 6c 62 61 63 6b 20 3d 20 63 6d 64 4f 62  callback = cmdOb
9170: 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  j;..    Tcl_Incr
9180: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
9190: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d  r->callback);..}
91a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
91b0: 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64  llocate password
91c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73   */.    if (pass
91d0: 77 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  wdObj != NULL) {
91e0: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
91f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61  StringFromObj(pa
9200: 73 73 77 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a  sswdObj, &len);.
9210: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
9220: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77   statePtr->passw
9230: 6f 72 64 20 3d 20 70 61 73 73 77 64 4f 62 6a 3b  ord = passwdObj;
9240: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
9250: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
9260: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20  >password);..}. 
9270: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
9280: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63  ocate validate c
9290: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66  ommand */.    if
92a0: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64   (vcmd) {..(void
92b0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
92c0: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65  romObj(vcmd, &le
92d0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
92e0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
92f0: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20  cmd = vcmd;..   
9300: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
9310: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  t(statePtr->vcmd
9320: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
9330: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55   if (model != NU
9340: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b  LL) {..int mode;
9350: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f  ../* Get the "mo
9360: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  del" context */.
9370: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43  .chan = Tcl_GetC
9380: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d  hannel(interp, m
9390: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69  odel, &mode);..i
93a0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
93b0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
93c0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
93d0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
93e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
93f0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
9400: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  *.. * Make sure 
9410: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
9420: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
9430: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  l.. */..chan = T
9440: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
9450: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c  (chan);..if (Tcl
9460: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
9470: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
9480: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20  nnelType()) {.. 
9490: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
94a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
94b0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
94c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
94d0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
94e0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
94f0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  ", NULL);..    T
9500: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
9510: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
9520: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45  IMPORT", "CHANNE
9530: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
9540: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
9550: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
9560: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
9570: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
9580: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20  _ERROR;..}..ctx 
9590: 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f  = ((State *)Tcl_
95a0: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
95b0: 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63  ceData(chan))->c
95c0: 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  tx;.    } else {
95d0: 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58  ..if ((ctx = CTX
95e0: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20  _Init(statePtr, 
95f0: 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b  server, proto, k
9600: 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65  eyfile, certfile
9610: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 28 69 6e  , key, cert, (in
9620: 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20  t) key_len,..   
9630: 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65 6e 2c   (int) cert_len,
9640: 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20   CAdir, CAfile, 
9650: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73  ciphers, ciphers
9660: 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48  uites, level, DH
9670: 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c  params)) == NULL
9680: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
9690: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
96a0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
96b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
96c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65      }..    state
96d0: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a  Ptr->ctx = ctx;.
96e0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
96f0: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
9700: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
9710: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69  nnel works in bi
9720: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20  nary (for the.  
9730: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20     * encryption 
9740: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
9750: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65  d up)..     * We
9760: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64   only want to ad
9770: 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69  just the bufferi
9780: 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61  ng in pre-v2 cha
9790: 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20  nnels, where.   
97a0: 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c    * each channel
97b0: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61   in the stack ma
97c0: 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e  intained its own
97d0: 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a   buffers..     *
97e0: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
97f0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
9800: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
9810: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9820: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
9830: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
9840: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
9850: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
9860: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
9870: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
9880: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
9890: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
98a0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
98b0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
98c0: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
98d0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
98e0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
98f0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9900: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  han, "-encoding"
9910: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
9920: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
9930: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
9940: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
9950: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
9960: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72   &upperChannelTr
9970: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
9980: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
9990: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
99a0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
99b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
99c0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
99d0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
99e0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
99f0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
9a00: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63  binary");.    Tc
9a10: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
9a20: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
9a30: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74   "-blocking", "t
9a40: 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e  rue");.    dprin
9a50: 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63  tf("Consuming Tc
9a60: 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54  l channel %s", T
9a70: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
9a80: 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74  e(chan));.    st
9a90: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54  atePtr->self = T
9aa0: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28  cl_StackChannel(
9ab0: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e  interp, Tls_Chan
9ac0: 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65  nelType(), (Clie
9ad0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
9ae0: 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45  ,..(TCL_READABLE
9af0: 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   | TCL_WRITABLE)
9b00: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72  , chan);.    dpr
9b10: 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68  intf("Created ch
9b20: 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c  annel named %s",
9b30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
9b40: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
9b50: 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74  lf));.    if (st
9b60: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
9b70: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
9b80: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f  LL) {../*.. * No
9b90: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e   use of Tcl_Even
9ba0: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75  tuallyFree becau
9bb0: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54  se no possible T
9bc0: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a  cl_Preserve... *
9bd0: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  /..Tls_Free((cha
9be0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
9bf0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
9c00: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
9c10: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
9c20: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
9c30: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61  Ptr->self, "-tra
9c40: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44  nslation", Tcl_D
9c50: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
9c60: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
9c70: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f  tion));.    Tcl_
9c80: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9c90: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
9ca0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64  r->self, "-encod
9cb0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
9cc0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9cd0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a  nnelEncoding));.
9ce0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
9cf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9d00: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
9d10: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c   "-eofchar", Tcl
9d20: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
9d30: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9d40: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ar));.    Tcl_Se
9d50: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9d60: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
9d70: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e  >self, "-blockin
9d80: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
9d90: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
9da0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20  elBlocking));.. 
9db0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
9dc0: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   Initialization.
9dd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74       */.    stat
9de0: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f  ePtr->ssl = SSL_
9df0: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74  new(statePtr->ct
9e00: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61  x);.    if (!sta
9e10: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f  tePtr->ssl) {../
9e20: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72  * SSL library er
9e30: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65  ror */..Tcl_Appe
9e40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9e50: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74   "couldn't const
9e60: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e  ruct ssl session
9e70: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
9e80: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
9e90: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
9ea0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
9eb0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
9ec0: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46  ORT", "INIT", "F
9ed0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
9ee0: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65   NULL);..Tls_Fre
9ef0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
9f00: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
9f10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
9f20: 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20      /* Set host 
9f30: 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20  server name */. 
9f40: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d     if (servernam
9f50: 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68  e) {../* Sets th
9f60: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e  e server name in
9f70: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69  dication (SNI) i
9f80: 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78  n ClientHello ex
9f90: 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50  tension */../* P
9fa0: 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73  er RFC 6066, hos
9fb0: 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49  tname is a ASCII
9fc0: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c   encoded string,
9fd0: 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 36   though RFC 4366
9fe0: 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a   says UTF-8. */.
9ff0: 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c  .if (!SSL_set_tl
a000: 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73  sext_host_name(s
a010: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
a020: 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71  rvername) && req
a030: 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c  uire) {..    Tcl
a040: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a050: 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20 65  terp, "Set SNI e
a060: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 3a  xtension failed:
a070: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
a080: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
a090: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
a0a0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
a0b0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
a0c0: 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49  RT", "SNI", "FAI
a0d0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
a0e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
a0f0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a100: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a110: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a120: 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e  }.../* Set hostn
a130: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72  ame for peer cer
a140: 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d  tificate hostnam
a150: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69  e verification i
a160: 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44  n clients...   D
a170: 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74  on't use SSL_set
a180: 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20  1_host since it 
a190: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e  has limitations.
a1a0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64   */..if (!SSL_ad
a1b0: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72  d1_host(statePtr
a1c0: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
a1d0: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  e)) {..    Tcl_A
a1e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a1f0: 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73  rp, "Set DNS hos
a200: 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c  tname failed: ",
a210: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
a220: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
a230: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
a240: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
a250: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
a260: 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46  , "HOSTNAME", "F
a270: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
a280: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
a290: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a2a0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a2b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a2c0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a2d0: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e  * Resume session
a2e0: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73   id */.    if (s
a2f0: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 65 73  ession_id && ses
a300: 73 5f 6c 65 6e 20 3c 3d 20 53 53 4c 5f 4d 41 58  s_len <= SSL_MAX
a310: 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29  _SID_CTX_LENGTH)
a320: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73   {../* SSL_set_s
a330: 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20  ession() */..if 
a340: 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65  (!SSL_SESSION_se
a350: 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53  t1_id_context(SS
a360: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74  L_get_session(st
a370: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65  atePtr->ssl), se
a380: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67  ssion_id, (unsig
a390: 6e 65 64 20 69 6e 74 29 20 73 65 73 73 5f 6c 65  ned int) sess_le
a3a0: 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  n)) {..    Tcl_A
a3b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a3c0: 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73  rp, "Resume sess
a3d0: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ion failed: ", G
a3e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
a3f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a400: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a410: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a420: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a430: 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c  "SESSION", "FAIL
a440: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
a450: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
a460: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
a470: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a480: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a490: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
a4a0: 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f  nable Applicatio
a4b0: 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c  n-Layer Protocol
a4c0: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78   Negotiation. Ex
a4d0: 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70  amples are: http
a4e0: 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c  /1.0,..http/1.1,
a4f0: 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d   h2, h3, ftp, im
a500: 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63  ap, pop3, xmpp-c
a510: 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76  lient, xmpp-serv
a520: 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65  er, mqtt, irc, e
a530: 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61  tc. */.    if (a
a540: 6c 70 6e 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  lpnObj != NULL) 
a550: 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20  {../* Convert a 
a560: 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  TCL list into a 
a570: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e  protocol-list in
a580: 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a   wire-format */.
a590: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
a5a0: 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73  protos, *p;..uns
a5b0: 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73  igned int protos
a5c0: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53  _len = 0;..Tcl_S
a5d0: 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74  ize cnt, i;..int
a5e0: 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c   j;..Tcl_Obj **l
a5f0: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c  ist;...if (Tcl_L
a600: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
a610: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 4f 62  s(interp, alpnOb
a620: 6a 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20  j, &cnt, &list) 
a630: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
a640: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
a650: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a660: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a670: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RROR;..}.../* De
a680: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f  termine the memo
a690: 72 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ry required for 
a6a0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
a6b0: 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30  t */..for (i = 0
a6c0: 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20  ; i < cnt; i++) 
a6d0: 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74  {..    Tcl_GetSt
a6e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
a6f0: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [i], &len);..   
a700: 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20   if (len > 255) 
a710: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
a720: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c  sult(interp, "AL
a730: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65  PN protocol name
a740: 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68  s too long", (ch
a750: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54  ar *) NULL);...T
a760: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
a770: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
a780: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
a790: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
a7a0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73   *) NULL);...Tls
a7b0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a7c0: 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75  tatePtr);...retu
a7d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
a7e0: 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73     }..    protos
a7f0: 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74  _len += 1 + (int
a800: 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42  ) len;..}.../* B
a810: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74  uild the complet
a820: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
a830: 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61  */..protos = cka
a840: 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29  lloc(protos_len)
a850: 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c  ;../* protocol-l
a860: 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20  ists consist of 
a870: 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65  8-bit length-pre
a880: 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69  fixed, byte stri
a890: 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d  ngs */..for (j =
a8a0: 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20   0, p = protos; 
a8b0: 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a  j < cnt; j++) {.
a8c0: 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d  .    char *str =
a8d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a8e0: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26  omObj(list[j], &
a8f0: 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20  len);..    *p++ 
a900: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
a910: 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63  ) len;..    memc
a920: 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65  py(p, str, (size
a930: 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70  _t) len);..    p
a940: 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a   += len;..}.../*
a950: 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72   SSL_set_alpn_pr
a960: 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70  otos makes a cop
a970: 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f  y of the protoco
a980: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f  l-list */../* No
a990: 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  te: This functio
a9a0: 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20  ns reverses the 
a9b0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e  return value con
a9c0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  vention */..if (
a9d0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
a9e0: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  tos(statePtr->ss
a9f0: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f  l, protos, proto
aa00: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54  s_len)) {..    T
aa10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
aa20: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50  interp, "Set ALP
aa30: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c  N protocols fail
aa40: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
aa50: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
aa60: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
aa70: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
aa80: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
aa90: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20  MPORT", "ALPN", 
aaa0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
aab0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
aac0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
aad0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
aae0: 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b   ckfree(protos);
aaf0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
ab00: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
ab10: 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20  Store protocols 
ab20: 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74  list */..statePt
ab30: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74  r->protos = prot
ab40: 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  os;..statePtr->p
ab50: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74  rotos_len = prot
ab60: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
ab70: 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e  se {..statePtr->
ab80: 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09  protos = NULL;..
ab90: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
aba0: 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  _len = 0;.    }.
abb0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
abc0: 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20  SL Callbacks.   
abd0: 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74    */.    SSL_set
abe0: 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50  _app_data(stateP
abf0: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
ac00: 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70  )statePtr);./* p
ac10: 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20  oint back to us 
ac20: 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  */..    SSL_set_
ac30: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
ac40: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
ac50: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
ac60: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
ac70: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
ac80: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
ac90: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
aca0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
acb0: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
acc0: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
acd0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
ace0: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
acf0: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
ad00: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
ad10: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
ad20: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
ad30: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
ad40: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
ad50: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
ad60: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
ad70: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
ad80: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
ad90: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
ada0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
adb0: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
adc0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
add0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
ade0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
adf0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
ae00: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
ae10: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
ae20: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
ae30: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
ae40: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
ae50: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
ae60: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
ae70: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
ae80: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
ae90: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
aea0: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
aeb0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
aec0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
aed0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
aee0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
aef0: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
af00: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
af10: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
af20: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
af30: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
af40: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
af50: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
af60: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
af70: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
af80: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
af90: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
afa0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
afb0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
afc0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
afd0: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
afe0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
aff0: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
b000: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
b010: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
b020: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
b030: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
b040: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
b050: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
b060: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
b070: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
b080: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
b090: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
b0a0: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
b0b0: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
b0c0: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
b0d0: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
b0e0: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
b0f0: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
b100: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
b110: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
b120: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
b130: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
b140: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
b150: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
b160: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
b170: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
b180: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26  post_handshake &
b190: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20  & tls1_3) {..   
b1a0: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
b1b0: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
b1c0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
b1d0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75  ;..}.../* set au
b1e0: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65  tomatic curve se
b1f0: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  lection */..SSL_
b200: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74  set_ecdh_auto(st
b210: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
b220: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
b230: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
b240: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
b250: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
b260: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
b270: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
b280: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
b290: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
b2a0: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
b2b0: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
b2c0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
b2d0: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
b2e0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
b2f0: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
b300: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
b310: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
b320: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
b330: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
b340: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
b350: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
b360: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
b370: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
b380: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
b390: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
b3a0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
b3b0: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
b3c0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
b3d0: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
b3e0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
b3f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
b400: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
b410: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
b420: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
b430: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
b440: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
b450: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
b460: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
b470: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
b480: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
b490: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
b4a0: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
b4b0: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
b4c0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
b4d0: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
b4e0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
b4f0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
b500: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
b510: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
b520: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
b530: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
b540: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
b550: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
b560: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
b570: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
b580: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
b590: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
b5a0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
b5b0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
b5c0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
b5d0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
b5e0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
b5f0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b600: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
b610: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
b620: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54  atePtr->self), T
b630: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20  CL_VOLATILE);.. 
b640: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b650: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
b660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
b6a0: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  *. * UnimportObj
b6b0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
b6c0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
b6d0: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65  nvoked to remove
b6e0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
b6f0: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a  nnel filter.. *.
b700: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
b710: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
b720: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
b730: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
b740: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
b750: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
b760: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
b770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
b7b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55   */.static int.U
b7c0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  nimportObjCmd(Cl
b7d0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
b7e0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
b7f0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
b800: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
b810: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
b820: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
b830: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
b840: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
b850: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64  on. */.    (void
b860: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
b870: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
b880: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
b890: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
b8a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b8b0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b8c0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
b8d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b8e0: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
b8f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
b900: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
b910: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  ring(objv[1]), N
b920: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
b930: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
b940: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
b950: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b960: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
b970: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
b980: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
b990: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
b9a0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
b9b0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
b9c0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
b9d0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
b9e0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
b9f0: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
ba00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ba10: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
ba20: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
ba30: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
ba40: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
ba50: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
ba60: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
ba70: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
ba80: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54  "TLS", "UNIMPORT
ba90: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
baa0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
bab0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
bac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
bad0: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  }..    if (Tcl_U
bae0: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
baf0: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
bb00: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74  CL_ERROR) {..ret
bb10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bb20: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
bb30: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
bb40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb80: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f  -----. *. * CTX_
bb90: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63  Init -- construc
bba0: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  t a SSL_CTX inst
bbb0: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ance. *. * Resul
bbc0: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53  ts:. *.A valid S
bbd0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20  SL_CTX instance 
bbe0: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53  or NULL.. *. * S
bbf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
bc00: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63  constructs SSL c
bc10: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
bc20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
bc70: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49   SSL_CTX *.CTX_I
bc80: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
bc90: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
bca0: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
bcb0: 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61  ar *keyfile, cha
bcc0: 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20  r *certfile,.   
bcd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bce0: 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  key, unsigned ch
bcf0: 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65  ar *cert, int ke
bd00: 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f  y_len, int cert_
bd10: 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72  len, char *CAdir
bd20: 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69  ,.    char *CAfi
bd30: 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72  le, char *cipher
bd40: 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  s, char *ciphers
bd50: 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c  uites, int level
bd60: 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73  , char *DHparams
bd70: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ) {.    Tcl_Inte
bd80: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61  rp *interp = sta
bd90: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
bda0: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
bdb0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
bdc0: 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20  DString ds;.    
bdd0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b  Tcl_DString ds1;
bde0: 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30  .    int off = 0
bdf0: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70  ;.    int load_p
be00: 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20  rivate_key;.    
be10: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44  const SSL_METHOD
be20: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64   *method;..    d
be30: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
be40: 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74  ;..    if (!prot
be50: 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  o) {..Tcl_Append
be60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
be70: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  no valid protoco
be80: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68  l selected", (ch
be90: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
bea0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
beb0: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20  ..    /* create 
bec0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  SSL context */.#
bed0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
bee0: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
bef0: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
bf00: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
bf10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
bf20: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20  NO_SSL2).    if 
bf30: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
bf40: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29  TLS_PROTO_SSL2))
bf50: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
bf60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
bf70: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L2 protocol not 
bf80: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
bf90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
bfa0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
bfb0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
bfc0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
bfd0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
bfe0: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28  O_SSL3).    if (
bff0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
c000: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20  LS_PROTO_SSL3)) 
c010: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
c020: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
c030: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
c040: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
c050: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
c060: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
c070: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
c080: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
c090: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c0a0: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
c0b0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
c0c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
c0d0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c0e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
c0f0: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.0 protocol not
c100: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
c110: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
c120: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
c130: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
c140: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
c150: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
c160: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
c170: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
c180: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
c190: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
c1a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c1b0: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
c1c0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
c1d0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
c1e0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
c1f0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
c200: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
c210: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
c220: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
c230: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_2).    if (ENA
c240: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
c250: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b  PROTO_TLS1_2)) {
c260: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c270: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
c280: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.2 protocol not
c290: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
c2a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
c2b0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
c2c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
c2d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
c2e0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
c2f0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
c300: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
c310: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
c320: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_3)) {..Tcl_Ap
c330: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c340: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74  p, "TLS 1.3 prot
c350: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
c360: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
c370: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
c380: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
c390: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
c3a0: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75   0) {../* Use fu
c3b0: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c  ll range */..SSL
c3c0: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
c3d0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
c3e0: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  0);..SSL_CTX_set
c3f0: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
c400: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  on(ctx, 0);.    
c410: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  }..    switch (p
c420: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e  roto) {.#if OPEN
c430: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
c440: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
c450: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
c460: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
c470: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
c480: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
c490: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74  PROTO_SSL2:..met
c4a0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
c4b0: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65   SSLv2_server_me
c4c0: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63  thod() : SSLv2_c
c4d0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
c4e0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
c4f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
c500: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
c510: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
c520: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c530: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
c540: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
c550: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09  LS_PROTO_SSL3:..
c560: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
c570: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72  r ? SSLv3_server
c580: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
c590: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  3_client_method(
c5a0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
c5b0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
c5c0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
c5d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
c5e0: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
c5f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c600: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
c610: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
c620: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
c630: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72  rver ? TLSv1_ser
c640: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
c650: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  LSv1_client_meth
c660: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
c670: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
c680: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
c690: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c6a0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
c6b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c6c0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
c6d0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
c6e0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65  ROTO_TLS1_1:..me
c6f0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
c700: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72  ? TLSv1_1_server
c710: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
c720: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  1_1_client_metho
c730: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
c740: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
c750: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
c760: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c770: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
c780: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c790: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
c7a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
c7b0: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74  OTO_TLS1_2:..met
c7c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
c7d0: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f   TLSv1_2_server_
c7e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
c7f0: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _2_client_method
c800: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
c810: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
c820: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
c830: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c840: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61  O_TLS1_3).    ca
c850: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
c860: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65  1_3:../* Use the
c870: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20   generic method 
c880: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  and constraint r
c890: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65  ange after conte
c8a0: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f  xt is created */
c8b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
c8c0: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72  ver ? TLS_server
c8d0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f  _method() : TLS_
c8e0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
c8f0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
c900: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a      default:../*
c910: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65   Negotiate highe
c920: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c  st available SSL
c930: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  /TLS version */.
c940: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
c950: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
c960: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
c970: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
c980: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
c990: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
c9a0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
c9b0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
c9c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c9d0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20  L_NO_SSL2)..off 
c9e0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
c9f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
ca00: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  2)   ? 0 : SSL_O
ca10: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e  P_NO_SSLv2);.#en
ca20: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
ca30: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
ca40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
ca50: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL3)..off |= (
ca60: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
ca70: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20  LS_PROTO_SSL3)  
ca80: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
ca90: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv3);.#endif.
caa0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
cab0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
cac0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
cad0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
cae0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
caf0: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30  ROTO_TLS1)   ? 0
cb00: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
cb10: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v1);.#endif.#if 
cb20: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
cb30: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
cb40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
cb50: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
cb60: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
cb70: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30  ROTO_TLS1_1) ? 0
cb80: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
cb90: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_1);.#endif.#i
cba0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
cbb0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
cbc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
cbd0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_2)..off |= (EN
cbe0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
cbf0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f  _PROTO_TLS1_2) ?
cc00: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
cc10: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_2);.#endif.
cc20: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
cc30: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
cc40: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
cc50: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
cc60: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
cc70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
cc80: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
cc90: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
cca0: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
ccb0: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
ccc0: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78  rror();..    ctx
ccd0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
cce0: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
ccf0: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28  !ctx) {..return(
cd00: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  NULL);.    }..  
cd10: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c    if (getenv(SSL
cd20: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09  KEYLOGFILE)) {..
cd30: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c  SSL_CTX_set_keyl
cd40: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c  og_callback(ctx,
cd50: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29   KeyLogCallback)
cd60: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
cd70: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
cd80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
cd90: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
cda0: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
cdb0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
cdc0: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  3) {..SSL_CTX_se
cdd0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
cde0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
cdf0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43  VERSION);..SSL_C
ce00: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
ce10: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
ce20: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  S1_3_VERSION);. 
ce30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
ce40: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72   /* Force cipher
ce50: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72   selection order
ce60: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20   by server */.  
ce70: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29    if (!isServer)
ce80: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
ce90: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
cea0: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45  _OP_CIPHER_SERVE
ceb0: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20  R_PREFERENCE);. 
cec0: 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
ced0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
cee0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20   < 0x10100000L. 
cef0: 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61     OpenSSL_add_a
cf00: 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b  ll_algorithms();
cf10: 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73   /* Load ciphers
cf20: 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a   and digests */.
cf30: 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f  #endif..    SSL_
cf40: 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61  CTX_set_app_data
cf50: 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74  (ctx, (void*)int
cf60: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65  erp);./* remembe
cf70: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
cf80: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  r */.    SSL_CTX
cf90: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
cfa0: 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f  , SSL_OP_ALL);./
cfb0: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f  * all SSL bug wo
cfc0: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20  rkarounds */.   
cfd0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
cfe0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
cff0: 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29  _NO_COMPRESSION)
d000: 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d  ;./* disable com
d010: 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66  pression even if
d020: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
d030: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
d040: 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b  tions(ctx, off);
d050: 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f  ../* disable pro
d060: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a  tocol versions *
d070: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
d080: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d090: 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53  x10101000L.    S
d0a0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28  SL_CTX_set_mode(
d0b0: 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55  ctx, SSL_MODE_AU
d0c0: 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61  TO_RETRY);./* ha
d0d0: 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61  ndle new handsha
d0e0: 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e  kes in backgroun
d0f0: 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74  d. On by default
d100: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e   in OpenSSL 1.1.
d110: 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  1. */.#endif.   
d120: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65   SSL_CTX_sess_se
d130: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78  t_cache_size(ctx
d140: 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20  , 128);..    /* 
d150: 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64  Set user defined
d160: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
d170: 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63   suites, and sec
d180: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20  urity level */. 
d190: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20     if ((ciphers 
d1a0: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c  != NULL) && !SSL
d1b0: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f  _CTX_set_cipher_
d1c0: 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72  list(ctx, cipher
d1d0: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
d1e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d1f0: 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69  "Set ciphers fai
d200: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69  led: No valid ci
d210: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29  phers", (char *)
d220: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
d230: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
d240: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d250: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
d260: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26  uites != NULL) &
d270: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  & !SSL_CTX_set_c
d280: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c  iphersuites(ctx,
d290: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20   ciphersuites)) 
d2a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d2b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
d2c0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66   cipher suites f
d2d0: 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20  ailed: No valid 
d2e0: 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20  ciphers", (char 
d2f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
d300: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
d310: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d320: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65  }..    /* Set se
d330: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
d340: 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20      if (level > 
d350: 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29  -1 && level < 6)
d360: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73   {../* SSL_set_s
d370: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f  ecurity_level */
d380: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65  ..SSL_CTX_set_se
d390: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78  curity_level(ctx
d3a0: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  , level);.    }.
d3b0: 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65  .    /* set some
d3c0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20   callbacks */.  
d3d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65    SSL_CTX_set_de
d3e0: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28  fault_passwd_cb(
d3f0: 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c  ctx, PasswordCal
d400: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f  lback);.    SSL_
d410: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
d420: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61  passwd_cb_userda
d430: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  ta(ctx, (void *)
d440: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
d450: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65  /* read a Diffie
d460: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74  -Hellman paramet
d470: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65  ers file, or use
d480: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e   the built-in on
d490: 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e  e */.#ifdef OPEN
d4a0: 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66  SSL_NO_DH.    if
d4b0: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55   (DHparams != NU
d4c0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
d4d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d4e0: 22 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75  "DH parameter su
d4f0: 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61  pport not availa
d500: 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ble", (char *) N
d510: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
d520: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
d530: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d540: 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64  lse.    {..DH* d
d550: 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73  h;..if (DHparams
d560: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
d570: 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20   BIO *bio;..    
d580: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
d590: 26 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d  &ds);..    bio =
d5a0: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32   BIO_new_file(F2
d5b0: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29  N(DHparams, &ds)
d5c0: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20  , "r");..    if 
d5d0: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44  (!bio) {...Tcl_D
d5e0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
d5f0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
d600: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
d610: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70  ld not find DH p
d620: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c  arameters file",
d630: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d640: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
d650: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
d660: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ULL;..    }...  
d670: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f    dh = PEM_read_
d680: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f  bio_DHparams(bio
d690: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
d6a0: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72  LL);..    BIO_fr
d6b0: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63  ee(bio);..    Tc
d6c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
d6d0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68  s);..    if (!dh
d6e0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
d6f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d700: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44  Could not read D
d710: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f  H parameters fro
d720: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  m file", (char *
d730: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
d740: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
d750: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
d760: 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58    }..    SSL_CTX
d770: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c  _set_tmp_dh(ctx,
d780: 20 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72   dh);..    DH_fr
d790: 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65  ee(dh);...} else
d7a0: 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77   {..    /* Use w
d7b0: 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72  ell known DH par
d7c0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76  ameters that hav
d7d0: 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f  e built-in suppo
d7e0: 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f  rt in OpenSSL */
d7f0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
d800: 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63  TX_set_dh_auto(c
d810: 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f  tx, 1)) {...Tcl_
d820: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d830: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
d840: 65 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75  enable set DH au
d850: 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  to: ", GET_ERR_R
d860: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
d870: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
d880: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
d890: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
d8a0: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e    }..}.    }.#en
d8b0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20  dif..    /* set 
d8c0: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20  our certificate 
d8d0: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76  */.    load_priv
d8e0: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20  ate_key = 0;.   
d8f0: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d   if (certfile !=
d900: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
d910: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
d920: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69  ..Tcl_DStringIni
d930: 74 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53  t(&ds);...if (SS
d940: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
d950: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
d960: 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64  F2N(certfile, &d
d970: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
d980: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20  _PEM) <= 0) {.. 
d990: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
d9a0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
d9b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d9c0: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
d9d0: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74  o set certificat
d9e0: 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69  e file ", certfi
d9f0: 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f  le, ": ",...GET_
da00: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
da10: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
da20: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
da30: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
da40: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  n NULL;..}.    }
da50: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21   else if (cert !
da60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
da70: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
da80: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
da90: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53  e_certificate_AS
daa0: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e  N1(ctx, cert_len
dab0: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a  , cert) <= 0) {.
dac0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
dad0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
dae0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
daf0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
db00: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63   to set certific
db10: 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52  ate: ",...GET_ER
db20: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
db30: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
db40: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
db50: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
db60: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  NULL;..}.    } e
db70: 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20  lse {..certfile 
db80: 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65  = (char*)X509_ge
db90: 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66  t_default_cert_f
dba0: 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c  ile();...if (SSL
dbb0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
dbc0: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63  cate_file(ctx, c
dbd0: 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c  ertfile, SSL_FIL
dbe0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
dbf0: 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63   {.#if 0..    Tc
dc00: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
dc10: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
dc20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dc30: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65  , "unable to use
dc40: 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69   default certifi
dc50: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
dc60: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47  tfile, ": ",...G
dc70: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
dc80: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
dc90: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
dca0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
dcb0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  turn NULL;.#endi
dcc0: 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  f..}.    }..    
dcd0: 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61  /* set our priva
dce0: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66  te key */.    if
dcf0: 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b   (load_private_k
dd00: 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69  ey) {..if (keyfi
dd10: 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65  le == NULL && ke
dd20: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  y == NULL) {..  
dd30: 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74    keyfile = cert
dd40: 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b  file;..}...if (k
dd50: 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  eyfile != NULL) 
dd60: 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68  {..    /* get th
dd70: 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73  e private key as
dd80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dd90: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  is certificate *
dda0: 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69  /..    if (keyfi
ddb0: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
ddc0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
ddd0: 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  le;..    }...   
dde0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
ddf0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65  _PrivateKey_file
de00: 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c  (ctx, F2N(keyfil
de10: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c  e, &ds), SSL_FIL
de20: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
de30: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
de40: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20  Free(&ds);.../* 
de50: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
de60: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
de70: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
de80: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f  result */...Tcl_
de90: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
dea0: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54  , NULL, TCL_STAT
deb0: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  IC);...Tcl_Appen
dec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ded0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70  "unable to set p
dee0: 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22  ublic key file "
def0: 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a  , keyfile, " ",.
df00: 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45  ..    GET_ERR_RE
df10: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
df20: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
df30: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
df40: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
df50: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
df60: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09  ingFree(&ds);...
df70: 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21  } else if (key !
df80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69  = NULL) {..    i
df90: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
dfa0: 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45  rivateKey_ASN1(E
dfb0: 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78  VP_PKEY_RSA, ctx
dfc0: 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c  , key,key_len) <
dfd0: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  = 0) {...Tcl_DSt
dfe0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
dff0: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
e000: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
e010: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
e020: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
e030: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
e040: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
e050: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
e060: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e070: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
e080: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22  et public key: "
e090: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
e0a0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
e0b0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
e0c0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
e0d0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
e0e0: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f  }../* Now we kno
e0f0: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64  w that a key and
e100: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20   cert have been 
e110: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20  set against.. * 
e120: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  the SSL context 
e130: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58  */..if (!SSL_CTX
e140: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b  _check_private_k
e150: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20  ey(ctx)) {..    
e160: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e170: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74  (interp, "privat
e180: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  e key does not m
e190: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69  atch the certifi
e1a0: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22  cate public key"
e1b0: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20  ,....     (char 
e1c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
e1d0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e1e0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
e1f0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  LL;..}.    }..  
e200: 20 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63    /* Set verific
e210: 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20  ation CAs */.   
e220: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
e230: 28 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  (&ds);.    Tcl_D
e240: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29  StringInit(&ds1)
e250: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  ;.    /* There i
e260: 73 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69  s one default di
e270: 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66  rectory, one def
e280: 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f  ault file, and o
e290: 6e 65 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65  ne default store
e2a0: 2e 0a 09 54 68 65 20 64 65 66 61 75 6c 74 20 43  ...The default C
e2b0: 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 64  A certificates d
e2c0: 69 72 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65  irectory (and de
e2d0: 66 61 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20  fault store) is 
e2e0: 69 6e 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09  in the OpenSSL..
e2f0: 63 65 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e  certs directory.
e300: 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72   It can be overr
e310: 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c  idden by the SSL
e320: 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61  _CERT_DIR env va
e330: 72 2e 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20  r. The..default 
e340: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20  CA certificates 
e350: 66 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63  file is called c
e360: 65 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64  ert.pem in the d
e370: 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09  efault OpenSSL..
e380: 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61  directory. It ca
e390: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
e3a0: 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f  by the SSL_CERT_
e3b0: 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f  FILE env var. */
e3c0: 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58  ../* int SSL_CTX
e3d0: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
e3e0: 69 66 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20  ify_dir(SSL_CTX 
e3f0: 2a 63 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53  *ctx) and int SS
e400: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e410: 74 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53  t_verify_file(SS
e420: 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20  L_CTX *ctx) */. 
e430: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
e440: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61  load_verify_loca
e450: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43  tions(ctx, F2N(C
e460: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e  Afile, &ds), F2N
e470: 28 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c  (CAdir, &ds1)) |
e480: 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  |..!SSL_CTX_set_
e490: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70  default_verify_p
e4a0: 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66  aths(ctx)) {.#if
e4b0: 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46   0..Tcl_DStringF
e4c0: 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44  ree(&ds);..Tcl_D
e4d0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
e4e0: 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72  ;../* Don't curr
e4f0: 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 68  ently care if th
e500: 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c  is fails */..Tcl
e510: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e520: 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75  terp, "SSL defau
e530: 6c 74 20 76 65 72 69 66 79 20 70 61 74 68 73 3a  lt verify paths:
e540: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
e550: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
e560: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
e570: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
e580: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20  n NULL;.#endif. 
e590: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74     }..    /* htt
e5a0: 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65  ps://sourceforge
e5b0: 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f  .net/p/tls/bugs/
e5c0: 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58  57/ */.    /* XX
e5d0: 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20  X:TODO: Let the 
e5e0: 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75  user supply valu
e5f0: 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20  es here instead 
e600: 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  of something tha
e610: 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20  t exists on the 
e620: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20  filesystem */.  
e630: 20 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20    if (CAfile != 
e640: 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f  NULL) {..STACK_O
e650: 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65  F(X509_NAME) *ce
e660: 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f  rtNames = SSL_lo
e670: 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c  ad_client_CA_fil
e680: 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  e(F2N(CAfile, &d
e690: 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61  s));..if (certNa
e6a0: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
e6b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e6c0: 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63  client_CA_list(c
e6d0: 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a  tx, certNames);.
e6e0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  .}.    }..    Tc
e6f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e700: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  s);.    Tcl_DStr
e710: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20  ingFree(&ds1);. 
e720: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d     return ctx;.}
e730: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
e780: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d  * StatusObjCmd -
e790: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69  - return certifi
e7a0: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74  cate for connect
e7b0: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52  ed peer.. *. * R
e7c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
e7d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
e7e0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
e7f0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
e800: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
e810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e840: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
e850: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a  ic int.StatusObj
e860: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
e870: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
e880: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
e890: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
e8a0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
e8b0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
e8c0: 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20  tePtr;.    X509 
e8d0: 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f  *peer;.    Tcl_O
e8e0: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20  bj *objPtr;.    
e8f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
e900: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e  ;.    char *chan
e910: 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72  nelName, *cipher
e920: 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b  s;.    int mode;
e930: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
e940: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b  ned char *proto;
e950: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
e960: 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  t len;.    int n
e970: 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f  id, res;.    (vo
e980: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
e990: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
e9a0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
e9b0: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a  (objc < 2 || obj
e9c0: 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d  c > 3 || (objc =
e9d0: 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54  = 3 && !strcmp(T
e9e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e9f0: 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29  v[1]), "-local")
ea00: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  )) {..Tcl_WrongN
ea10: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ea20: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c  , objv, "?-local
ea30: 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65  ? channel");..re
ea40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ea50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
ea60: 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a  t channel Id */.
ea70: 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20      channelName 
ea80: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
ea90: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a  romObj(objv[(obj
eaa0: 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d  c == 2 ? 1 : 2)]
eab0: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e  , (Tcl_Size *) N
eac0: 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d  ULL);.    chan =
ead0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
eae0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e  interp, channelN
eaf0: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  ame, &mode);.   
eb00: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
eb10: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
eb20: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
eb30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
eb40: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
eb50: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
eb60: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
eb70: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
eb80: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
eb90: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
eba0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
ebb0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
ebc0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
ebd0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
ebe0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
ebf0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
ec00: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
ec10: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
ec20: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
ec30: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
ec40: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
ec50: 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53  , "TLS", "STATUS
ec60: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
ec70: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
ec80: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
ec90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
eca0: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
ecb0: 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47   (State *) Tcl_G
ecc0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
ecd0: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
ece0: 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69    /* Get certifi
ecf0: 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72  cate for peer or
ed00: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20   self */.    if 
ed10: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70  (objc == 2) {..p
ed20: 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  eer = SSL_get_pe
ed30: 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73  er_certificate(s
ed40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
ed50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65     } else {..pee
ed60: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74  r = SSL_get_cert
ed70: 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
ed80: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->ssl);.    }.. 
ed90: 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63     /* Get X509 c
eda0: 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
edb0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29  */.    if (peer)
edc0: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73   {..objPtr = Tls
edd0: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
ede0: 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28  rp, peer);..if (
edf0: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20  objc == 2) {..  
ee00: 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72    X509_free(peer
ee10: 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e  );..    peer = N
ee20: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
ee30: 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
ee40: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
ee50: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
ee60: 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20     /* Peer name 
ee70: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
ee80: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
ee90: 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53  r, "peername", S
eea0: 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65  SL_get0_peername
eeb0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
eec0: 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e   -1);.    LAPPEN
eed0: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
eee0: 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53  jPtr, "sbits", S
eef0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
ef00: 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
ef10: 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63  , NULL));..    c
ef20: 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
ef30: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
ef40: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
ef50: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
ef60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
ef70: 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
ef80: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
ef90: 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63  erify the X509 c
efa0: 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65  ertificate prese
efb0: 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72  nted by the peer
efc0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
efd0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
efe0: 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c  tr, "verifyResul
eff0: 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79  t",..X509_verify
f000: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
f010: 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
f020: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
f030: 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a  r->ssl)), -1);..
f040: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
f050: 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d  de */.    mode =
f060: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
f070: 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73  mode(statePtr->s
f080: 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64  sl);.    if (mod
f090: 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
f0a0: 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44  NONE) {..LAPPEND
f0b0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
f0c0: 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
f0d0: 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
f0e0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
f0f0: 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74  l_Obj *listObjPt
f100: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
f110: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  bj(0, NULL);..if
f120: 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
f130: 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20  RIFY_PEER) {..  
f140: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f150: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
f160: 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
f170: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f180: 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d  "peer", -1));..}
f190: 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
f1a0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
f1b0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
f1c0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
f1d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f1e0: 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
f1f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f200: 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20  Obj("fail if no 
f210: 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29  peer cert", -1))
f220: 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
f230: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  & SSL_VERIFY_CLI
f240: 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20  ENT_ONCE) {..   
f250: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f260: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f270: 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
f280: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f290: 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31  client once", -1
f2a0: 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
f2b0: 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   && SSL_VERIFY_P
f2c0: 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b  OST_HANDSHAKE) {
f2d0: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
f2e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f2f0: 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
f300: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f310: 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68  Obj("post handsh
f320: 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ake", -1));..}..
f330: 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
f340: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
f350: 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62  ifyMode", listOb
f360: 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20  jPtr).    }..   
f370: 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
f380: 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50  depth */.    LAP
f390: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
f3a0: 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
f3b0: 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f  Depth", SSL_get_
f3c0: 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61  verify_depth(sta
f3d0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20  tePtr->ssl));.. 
f3e0: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65     /* Report the
f3f0: 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
f400: 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
f410: 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
f420: 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74  n */.    SSL_get
f430: 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
f440: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
f450: 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20  proto, &len);.  
f460: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
f470: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
f480: 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72  lpn", (char *)pr
f490: 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  oto, (Tcl_Size) 
f4a0: 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
f4b0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
f4c0: 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
f4d0: 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
f4e0: 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
f4f0: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
f500: 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41  alid for non-RSA
f510: 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54   signature and T
f520: 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66  LS 1.3 */.    if
f530: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
f540: 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
f550: 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  er_signature_nid
f560: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
f570: 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
f580: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
f590: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  et_signature_nid
f5a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
f5b0: 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
f5c0: 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
f5d0: 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
f5e0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
f5f0: 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
f600: 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20  HashAlgorithm", 
f610: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
f620: 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f   -1);..    if (o
f630: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73  bjc == 2) {..res
f640: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
f650: 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
f660: 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
f670: 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65  , &nid);.    } e
f680: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
f690: 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74  _get_signature_t
f6a0: 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ype_nid(statePtr
f6b0: 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
f6c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73    }.    if (!res
f6d0: 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20  ) {nid = 0;}.   
f6e0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
f6f0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69  erp, objPtr, "si
f700: 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42  gnatureType", OB
f710: 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
f720: 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  1);..    Tcl_Set
f730: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
f740: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
f750: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f760: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
f7b0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
f7c0: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
f7d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  connection info 
f7e0: 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a  from OpenSSL.. *
f7f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
f800: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63  A list of connec
f810: 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a  tion info.  *. *
f820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f860: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
f870: 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  int ConnectionIn
f880: 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  foObjCmd(ClientD
f890: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
f8a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
f8b0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
f8c0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
f8d0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
f8e0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
f8f0: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
f900: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f  set a mode on */
f910: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
f920: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
f930: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
f940: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c  ocket */.    Tcl
f950: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c  _Obj *objPtr, *l
f960: 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  istPtr;.    cons
f970: 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20  t SSL *ssl;.    
f980: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52  const SSL_CIPHER
f990: 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f   *cipher;.    co
f9a0: 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  nst SSL_SESSION 
f9b0: 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f  *session;.    co
f9c0: 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a  nst EVP_MD *md;.
f9d0: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
f9e0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28  tData;..    if (
f9f0: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
fa00: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fa10: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
fa20: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
fa30: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
fa40: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
fa50: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
fa60: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
fa70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
fa80: 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65  jv[1], (Tcl_Size
fa90: 20 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29   *) NULL), NULL)
faa0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
fab0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
fac0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28  NULL) {..return(
fad0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
fae0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
faf0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
fb00: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
fb10: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
fb20: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
fb30: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
fb40: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
fb50: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
fb60: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
fb70: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
fb80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fb90: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
fba0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
fbb0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
fbc0: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
fbd0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
fbe0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
fbf0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
fc00: 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20  , "CONNECTION", 
fc10: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
fc20: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
fc30: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  ULL);..return(TC
fc40: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
fc50: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
fc60: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
fc70: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  NULL);..    /* C
fc80: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a  onnection info *
fc90: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  /.    statePtr =
fca0: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
fcb0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
fcc0: 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20  Data(chan);.    
fcd0: 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  ssl = statePtr->
fce0: 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c  ssl;.    if (ssl
fcf0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20   != NULL) {../* 
fd00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65  connection state
fd10: 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
fd20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fd30: 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74   "state", SSL_st
fd40: 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ate_string_long(
fd50: 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
fd60: 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65  Get SNI requeste
fd70: 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  d server name */
fd80: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
fd90: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
fda0: 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f  ervername", SSL_
fdb0: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
fdc0: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
fdd0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20  YPE_host_name), 
fde0: 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72  -1);.../* Get pr
fdf0: 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45  otocol */..LAPPE
fe00: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
fe10: 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
fe20: 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  ", SSL_get_versi
fe30: 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09  on(ssl), -1);...
fe40: 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e  /* Renegotiation
fe50: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50   allowed */..LAP
fe60: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
fe70: 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67  , objPtr, "reneg
fe80: 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64  otiation_allowed
fe90: 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72  ", SSL_get_secur
fea0: 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f  e_renegotiation_
feb0: 73 75 70 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a  support(ssl));..
fec0: 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79  ./* Get security
fed0: 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45   level */..LAPPE
fee0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
fef0: 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79  bjPtr, "security
ff00: 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74  _level", SSL_get
ff10: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
ff20: 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ssl));.../* Sess
ff30: 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ion info */..LAP
ff40: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
ff50: 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
ff60: 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f  on_reused", SSL_
ff70: 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73  session_reused(s
ff80: 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65  sl));.../* Is se
ff90: 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  rver info */..LA
ffa0: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
ffb0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73  p, objPtr, "is_s
ffc0: 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73  erver", SSL_is_s
ffd0: 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f  erver(ssl));.../
ffe0: 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41  * Is DTLS */..LA
fff0: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
10000 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64  p, objPtr, "is_d
10010 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c  tls", SSL_is_dtl
10020 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a  s(ssl));.    }..
10030 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e      /* Cipher in
10040 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72  fo */.    cipher
10050 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
10060 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a  nt_cipher(ssl);.
10070 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21      if (cipher !
10080 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
10090 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30  buf[BUFSIZ] = {0
100a0 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c  };..int bits, al
100b0 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70  g_bits;.../* Cip
100c0 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50  her name */..LAP
100d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
100e0 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
100f0 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ", SSL_CIPHER_ge
10100 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  t_name(cipher), 
10110 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61  -1);.../* RFC na
10120 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
10130 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10140 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
10150 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53  andard_name", SS
10160 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72  L_CIPHER_standar
10170 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  d_name(cipher), 
10180 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53  -1);.../* OpenSS
10190 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72  L name of cipher
101a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
101b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
101c0 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c   "openssl_name",
101d0 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f   OPENSSL_cipher_
101e0 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f  name(SSL_CIPHER_
101f0 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69  standard_name(ci
10200 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f  pher)), -1);.../
10210 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72  * number of secr
10220 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72  et bits used for
10230 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73   cipher */..bits
10240 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
10250 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26  t_bits(cipher, &
10260 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50  alg_bits);..LAPP
10270 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
10280 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f  objPtr, "secret_
10290 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c  bits", bits);..L
102a0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
102b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f  p, objPtr, "algo
102c0 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67  rithm_bits", alg
102d0 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f  _bits);../* alg_
102e0 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b  bits is actual k
102f0 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20  ey secret bits. 
10300 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20  If use bits and 
10310 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68  secret (algorith
10320 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a  m) bits differ,.
10330 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20  .   the rest of 
10340 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78  the bits are fix
10350 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d  ed, i.e. for lim
10360 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68  ited export ciph
10370 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20  ers (bits < 56) 
10380 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65  */.../* Indicate
10390 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20  s which SSL/TLS 
103a0 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
103b0 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74   first defined t
103c0 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  he cipher */..LA
103d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
103e0 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76  , objPtr, "min_v
103f0 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50  ersion", SSL_CIP
10400 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  HER_get_version(
10410 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
10420 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 2c 20 64  /* Cipher NID, d
10430 69 67 65 73 74 20 4e 49 44 20 28 6e 6f 6e 65 20  igest NID (none 
10440 66 6f 72 20 41 45 41 44 20 63 69 70 68 65 72 20  for AEAD cipher 
10450 73 75 69 74 65 73 29 2c 20 4b 65 79 20 45 78 63  suites), Key Exc
10460 68 61 6e 67 65 20 4e 49 44 2c 20 61 6e 64 20 61  hange NID, and a
10470 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 4e 49  uthentication NI
10480 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  D */..LAPPEND_ST
10490 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
104a0 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28  , "cipherNID", (
104b0 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
104c0 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
104d0 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68  _cipher_nid(ciph
104e0 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  er)), -1);..LAPP
104f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10500 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e  objPtr, "digestN
10510 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
10520 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
10530 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69  ER_get_digest_ni
10540 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
10550 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10560 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b  terp, objPtr, "k
10570 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20  eyExchangeNID", 
10580 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
10590 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
105a0 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29  t_kx_nid(cipher)
105b0 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
105c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
105d0 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61  Ptr, "authentica
105e0 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20  tionNID", (char 
105f0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
10600 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68  _CIPHER_get_auth
10610 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
10620 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65  1);.../* message
10630 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
10640 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73  code - Cipher is
10650 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20   AEAD (e.g. GCM 
10660 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79  or ChaCha20/Poly
10670 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a  1305) or not */.
10680 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65  ./* Authenticate
10690 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74  d Encryption wit
106a0 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  h associated dat
106b0 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a  a (AEAD) check *
106c0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
106d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
106e0 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22  "cipher_is_aead"
106f0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f  , SSL_CIPHER_is_
10700 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a  aead(cipher));..
10710 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d  ./* Get OpenSSL-
10720 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74  specific ID, not
10730 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50   IANA ID */..LAP
10740 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
10750 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
10760 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
10770 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69  CIPHER_get_id(ci
10780 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f  pher));.../* Two
10790 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69 6e  -byte ID used in
107a0 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f   the TLS protoco
107b0 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  l of the given c
107c0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
107d0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
107e0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f  jPtr, "protocol_
107f0 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43  id", (int) SSL_C
10800 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63  IPHER_get_protoc
10810 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  ol_id(cipher));.
10820 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73  ../* Textual des
10830 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
10840 63 69 70 68 65 72 2e 20 49 6e 63 6c 75 64 65 73  cipher. Includes
10850 3a 20 63 69 70 68 65 72 20 6e 61 6d 65 2c 20 70  : cipher name, p
10860 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 2c  rotocol version,
10870 20 6b 65 79 0a 09 20 20 20 65 78 63 68 61 6e 67   key..   exchang
10880 65 2c 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  e, authenticatio
10890 6e 2c 20 73 79 6d 6d 65 74 72 69 63 20 65 6e 63  n, symmetric enc
108a0 72 79 70 74 69 6f 6e 20 6d 65 74 68 6f 64 2c 20  ryption method, 
108b0 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69  message authenti
108c0 63 61 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a 09  cation code */..
108d0 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
108e0 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65  escription(ciphe
108f0 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  r, buf, sizeof(b
10900 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  uf)) != NULL) {.
10910 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10920 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10930 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20   "description", 
10940 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 0a 09 2f  buf, -1);..}.../
10950 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75  * Digest used du
10960 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53  ring the SSL/TLS
10970 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20   handshake when 
10980 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72  using the cipher
10990 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43  . */..md = SSL_C
109a0 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68  IPHER_get_handsh
109b0 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65  ake_digest(ciphe
109c0 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  r);..LAPPEND_STR
109d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
109e0 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65   "handshake_dige
109f0 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50  st", (char *)EVP
10a00 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31  _MD_name(md), -1
10a10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10a20 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f   Session info */
10a30 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53  .    session = S
10a40 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
10a50 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73  sl);.    if (ses
10a60 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  sion != NULL) {.
10a70 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
10a80 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73  char *ticket;..s
10a90 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73  ize_t len2;..uns
10aa0 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a  igned int ulen;.
10ab0 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
10ac0 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64  char *session_id
10ad0 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72 20  , *proto;..char 
10ae0 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d  buffer[SSL_MAX_M
10af0 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48  ASTER_KEY_LENGTH
10b00 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  ];.../* Report t
10b10 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
10b20 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
10b30 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67   of the ALPN neg
10b40 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c  otiation */..SSL
10b50 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c  _SESSION_get0_al
10b60 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73  pn_selected(sess
10b70 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ion, &proto, &le
10b80 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  n2);..LAPPEND_ST
10b90 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10ba0 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20  , "alpn", (char 
10bb0 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53  *) proto, (Tcl_S
10bc0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
10bd0 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
10be0 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
10bf0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10c00 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e   NPN negotiation
10c10 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
10c20 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78  PN..SSL_get0_nex
10c30 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74  t_proto_negotiat
10c40 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  ed(ssl, &proto, 
10c50 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
10c60 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10c70 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61  Ptr, "npn", (cha
10c80 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c  r *) proto, (Tcl
10c90 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65  _Size) ulen);.#e
10ca0 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61  ndif.../* Resuma
10cb0 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09  ble session */..
10cc0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
10cd0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65  erp, objPtr, "re
10ce0 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45  sumable", SSL_SE
10cf0 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62  SSION_is_resumab
10d00 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  le(session));...
10d10 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74  /* Session start
10d20 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73   time (seconds s
10d30 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09  ince epoch) */..
10d40 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74  LAPPEND_LONG(int
10d50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
10d60 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53  art_time", SSL_S
10d70 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28  ESSION_get_time(
10d80 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
10d90 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20  Timeout value - 
10da0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65  SSL_CTX_get_time
10db0 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  out (in seconds)
10dc0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
10dd0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
10de0 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c  , "timeout", SSL
10df0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d  _SESSION_get_tim
10e00 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a  eout(session));.
10e10 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20  ../* Session id 
10e20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65  - TLSv1.2 and be
10e30 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73  low only */..ses
10e40 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
10e50 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
10e60 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
10e70 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
10e80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10e90 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73  ession_id", sess
10ea0 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
10eb0 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
10ec0 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  ession context *
10ed0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
10ee0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
10ef0 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73  _id_context(sess
10f00 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
10f10 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
10f20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
10f30 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20  ssion_context", 
10f40 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
10f50 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09  _Size) ulen);...
10f60 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
10f70 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
10f80 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
10f90 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
10fa0 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
10fb0 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
10fc0 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
10fd0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74  jPtr, "session_t
10fe0 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20  icket", ticket, 
10ff0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
11000 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74  ;.../* Session t
11010 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68  icket lifetime h
11020 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  int (in seconds)
11030 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
11040 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
11050 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53  , "lifetime", SS
11060 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
11070 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
11080 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  nt(session));...
11090 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61  /* Ticket app da
110a0 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  ta */..SSL_SESSI
110b0 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61  ON_get0_ticket_a
110c0 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20  ppdata(session, 
110d0 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
110e0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
110f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11100 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74   "ticket_app_dat
11110 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  a", ticket, (Tcl
11120 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
11130 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65  /* Get master ke
11140 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c  y */..len2 = SSL
11150 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73  _SESSION_get_mas
11160 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c  ter_key(session,
11170 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58   buffer, SSL_MAX
11180 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
11190 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  TH);..LAPPEND_BA
111a0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
111b0 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79  Ptr, "master_key
111c0 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f  ", buffer, (Tcl_
111d0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
111e0 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64  * Compression id
111f0 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e   */..unsigned in
11200 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  t id = SSL_SESSI
11210 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f  ON_get_compress_
11220 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41  id(session);..LA
11230 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11240 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
11250 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d  ession_id", id =
11260 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22  = 1 ? "zlib" : "
11270 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
11280 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  }..    /* Compre
11290 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
112a0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
112b0 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45  L) {.#ifdef HAVE
112c0 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  _SSL_COMPRESSION
112d0 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54  ..const COMP_MET
112e0 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e  HOD *comp, *expn
112f0 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65  ;..comp = SSL_ge
11300 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65  t_current_compre
11310 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70  ssion(ssl);..exp
11320 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  n = SSL_get_curr
11330 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73  ent_expansion(ss
11340 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l);...LAPPEND_ST
11350 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11360 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  , "compression",
11370 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50   comp ? SSL_COMP
11380 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
11390 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09  : "none", -1);..
113a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
113b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70  rp, objPtr, "exp
113c0 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20  ansion", expn ? 
113d0 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
113e0 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22  e(expn) : "none"
113f0 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41  , -1);.#else..LA
11400 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11410 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
11420 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c  ession", "none",
11430 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
11440 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11450 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
11460 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e  "none", -1);.#en
11470 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
11480 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  * Server info */
11490 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64  .    {..long mod
114a0 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f  e = SSL_CTX_get_
114b0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
114c0 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
114d0 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a  );..char *msg;..
114e0 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f  .if (mode & SSL_
114f0 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20  SESS_CACHE_OFF) 
11500 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66  {..    msg = "of
11510 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  f";..} else if (
11520 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
11530 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
11540 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65  .    msg = "clie
11550 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  nt";..} else if 
11560 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
11570 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b  _CACHE_SERVER) {
11580 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72  ..    msg = "ser
11590 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ver";..} else if
115a0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
115b0 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a  S_CACHE_BOTH) {.
115c0 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68  .    msg = "both
115d0 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ";..} else {..  
115e0 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e    msg = "unknown
115f0 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53  ";..}..LAPPEND_S
11600 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11610 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68  r, "session_cach
11620 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31  e_mode", msg, -1
11630 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11640 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20   CA List */.    
11650 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76  /* IF not a serv
11660 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  er, same as SSL_
11670 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73  get0_peer_CA_lis
11680 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d  t. If server sam
11690 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74  e as SSL_CTX_get
116a0 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20  _client_CA_list 
116b0 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d  */.    listPtr =
116c0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
116d0 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54  0, NULL);.    ST
116e0 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
116f0 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20  ) *ca_list;.    
11700 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53  if ((ca_list = S
11710 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  SL_get_client_CA
11720 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e  _list(ssl)) != N
11730 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
11740 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 0a 09 66  fer[BUFSIZ];...f
11750 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
11760 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   < sk_X509_NAME_
11770 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b  num(ca_list); i+
11780 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e  +) {..    X509_N
11790 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58  AME *name = sk_X
117a0 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63  509_NAME_value(c
117b0 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20  a_list, i);..   
117c0 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58   if (name) {...X
117d0 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65  509_NAME_oneline
117e0 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42  (name, buffer, B
117f0 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69  UFSIZ);...Tcl_Li
11800 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11810 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
11820 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
11830 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
11840 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
11850 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f   }.    LAPPEND_O
11860 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
11870 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73  r, "caList", lis
11880 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45  tPtr);.    LAPPE
11890 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
118a0 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f  bjPtr, "caListCo
118b0 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41  unt", sk_X509_NA
118c0 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29  ME_num(ca_list))
118d0 3b 0a 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;...    Tcl_SetO
118e0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
118f0 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
11900 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
11910 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
11920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11950 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
11960 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69  MiscObjCmd -- mi
11970 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  sc commands. *. 
11980 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
11990 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
119a0 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
119b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
119c0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
11a10 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62  tatic int.MiscOb
11a20 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
11a30 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
11a40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
11a50 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
11a60 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
11a70 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
11a80 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e  nst char *comman
11a90 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c  ds [] = { "req",
11aa0 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20   "strreq", NULL 
11ab0 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d  };.    enum comm
11ac0 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53  and { C_REQ, C_S
11ad0 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d  TRREQ, C_DUMMY }
11ae0 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
11af0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74  md;.    int isSt
11b00 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
11b10 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28  er[16384];.    (
11b20 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
11b30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
11b40 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
11b50 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
11b60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11b70 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11b80 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61  , "subcommand ?a
11b90 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  rgs?");..return 
11ba0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11bb0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
11bc0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
11bd0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f  erp, objv[1], co
11be0 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64  mmands, "command
11bf0 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54  ", 0, &cmd) != T
11c00 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
11c10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11c20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
11c30 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69  _error();..    i
11c40 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43  sStr = (cmd == C
11c50 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77  _STRREQ);.    sw
11c60 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d  itch ((enum comm
11c70 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73  and) cmd) {..cas
11c80 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43  e C_REQ:..case C
11c90 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20  _STRREQ: {..    
11ca0 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e  EVP_PKEY *pkey=N
11cb0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a  ULL;..    X509 *
11cc0 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  cert=NULL;..    
11cd0 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d  X509_NAME *name=
11ce0 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f  NULL;..    Tcl_O
11cf0 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20  bj **listv;..   
11d00 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b   Tcl_Size listc;
11d10 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20  ..    int i;... 
11d20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
11d30 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
11d40 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
11d50 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
11d60 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
11d70 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
11d80 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
11d90 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
11da0 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
11db0 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
11dc0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
11dd0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
11de0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
11df0 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
11e00 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
11e10 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
11e20 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
11e30 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
11e40 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
11e50 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
11e60 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
11e70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11e80 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
11e90 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
11ea0 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
11eb0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
11ec0 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
11ed0 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
11ee0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
11ef0 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
11f00 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
11f10 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11f20 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
11f30 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
11f40 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
11f50 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
11f60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
11f70 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
11f80 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
11f90 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
11fa0 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
11fb0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
11fc0 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
11fd0 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
11fe0 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
11ff0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
12000 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
12010 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  , &listc, &listv
12020 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
12030 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12040 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
12050 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
12060 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
12070 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
12080 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
12090 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
120a0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
120b0 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
120c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
120d0 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
120e0 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
120f0 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
12100 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12110 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
12120 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
12130 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
12140 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
12150 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
12160 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
12170 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
12180 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
12190 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
121a0 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
121b0 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
121c0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
121d0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
121e0 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
121f0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
12200 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12210 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
12220 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
12230 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
12240 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12250 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
12260 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
12270 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
12280 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
12290 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
122a0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
122b0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
122c0 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
122d0 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
122e0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
122f0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
12300 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
12310 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
12320 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
12330 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
12340 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
12350 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
12360 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
12370 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
12380 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
12390 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
123a0 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
123b0 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
123c0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
123d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
123e0 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
123f0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
12400 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
12410 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
12420 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
12430 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
12440 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
12450 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
12460 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
12470 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
12480 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
12490 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
124a0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
124b0 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f  L..    bne = BN_
124c0 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20  new();..    rsa 
124d0 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20  = RSA_new();..  
124e0 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45    pkey = EVP_PKE
124f0 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66  Y_new();..    if
12500 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bne == NULL ||
12510 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   rsa == NULL || 
12520 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
12530 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65  !BN_set_word(bne
12540 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52  ,RSA_F4) ||...!R
12550 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f  SA_generate_key_
12560 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c  ex(rsa, keysize,
12570 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21   bne, NULL) || !
12580 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
12590 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20  RSA(pkey, rsa)) 
125a0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
125b0 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53  e(pkey);.../* RS
125c0 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65  A_free(rsa); fre
125d0 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66  ed by EVP_PKEY_f
125e0 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65  ree */...BN_free
125f0 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20  (bne);.#else..  
12600 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41    pkey = EVP_RSA
12610 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69  _gen((unsigned i
12620 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20  nt) keysize);.. 
12630 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45     ctx = EVP_PKE
12640 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e  Y_CTX_new(pkey,N
12650 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
12660 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  key == NULL || c
12670 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  tx == NULL || !E
12680 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69  VP_PKEY_keygen_i
12690 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45  nit(ctx) ||...!E
126a0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
126b0 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28  rsa_keygen_bits(
126c0 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c  ctx, keysize) ||
126d0 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
126e0 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b  n(ctx, &pkey)) {
126f0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
12700 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b  (pkey);...EVP_PK
12710 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  EY_CTX_free(ctx)
12720 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53  ;.#endif...Tcl_S
12730 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
12740 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
12750 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e  g private key",N
12760 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
12770 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
12780 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73   else {...if (is
12790 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
127a0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
127b0 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
127c0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
127d0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
127e0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
127f0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42  NULL);...    i=B
12800 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
12810 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
12820 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
12830 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
12840 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
12850 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
12860 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
12870 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
12880 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
12890 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
128a0 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
128b0 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
128c0 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
128d0 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
128e0 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
128f0 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,keyout);...    
12900 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
12910 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
12920 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
12930 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
12940 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f  /* PEM_write_bio
12950 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f  _RSAPrivateKey(o
12960 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e  ut, rsa, NULL, N
12970 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  ULL, 0, NULL, NU
12980 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49  LL); */...    BI
12990 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
129a0 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65  .. .}....if ((ce
129b0 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
129c0 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
129d0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
129e0 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
129f0 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
12a00 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
12a10 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
12a20 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
12a30 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
12a40 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
12a50 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
12a60 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
12a70 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ..    return(TCL
12a80 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09  _ERROR);...}....
12a90 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e  X509_set_version
12aa0 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31  (cert,2);...ASN1
12ab0 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30  _INTEGER_set(X50
12ac0 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62  9_get_serialNumb
12ad0 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29  er(cert),serial)
12ae0 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
12af0 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
12b00 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29  tBefore(cert),0)
12b10 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
12b20 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
12b30 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f  tAfter(cert),(lo
12b40 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73  ng)60*60*24*days
12b50 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75  );...X509_set_pu
12b60 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b  bkey(cert,pkey);
12b70 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65  ....name=X509_ge
12b80 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
12b90 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41  ert);....X509_NA
12ba0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
12bb0 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42  txt(name,"C", MB
12bc0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
12bd0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12be0 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c   *) k_C, -1, -1,
12bf0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
12c00 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
12c10 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53  t(name,"ST", MBS
12c20 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
12c30 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
12c40 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c  *) k_ST, -1, -1,
12c50 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
12c60 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
12c70 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54  t(name,"L", MBST
12c80 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
12c90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12ca0 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_L, -1, -1, 0
12cb0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
12cc0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
12cd0 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49  name,"O", MBSTRI
12ce0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
12cf0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
12d00 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_O, -1, -1, 0);
12d10 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12d20 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12d30 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e  me,"OU", MBSTRIN
12d40 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
12d50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
12d60 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
12d70 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12d80 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12d90 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
12da0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
12db0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
12dc0 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _CN, -1, -1, 0);
12dd0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12de0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12df0 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54  me,"Email", MBST
12e00 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
12e10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12e20 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d  ) k_Email, -1, -
12e30 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73  1, 0);....X509_s
12e40 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
12e50 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69  cert,name);....i
12e60 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65  f (!X509_sign(ce
12e70 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32  rt,pkey,EVP_sha2
12e80 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58  56())) {...    X
12e90 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
12ea0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
12eb0 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
12ec0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
12ed0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
12ee0 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65  00L...    BN_fre
12ef0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
12f00 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
12f10 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
12f20 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69   signing certifi
12f30 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  cate",NULL);... 
12f40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12f50 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
12f60 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f  isStr) {...    o
12f70 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
12f80 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50  _mem());...    P
12f90 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
12fa0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
12fb0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
12fc0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
12fd0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
12fe0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
12ff0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
13000 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
13010 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
13020 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,pemout,buffer,0
13030 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
13040 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
13050 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
13060 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
13070 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
13080 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
13090 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
130a0 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a  me(out,pemout);.
130b0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
130c0 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72  bio_X509(out,cer
130d0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
130e0 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d  ee_all(out);...}
130f0 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65  ....X509_free(ce
13100 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  rt);...EVP_PKEY_
13110 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
13120 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13130 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13140 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62  000L...BN_free(b
13150 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20  ne);.#endif..   
13160 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20   }..}..break;.  
13170 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61    default:..brea
13180 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
13190 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
131a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
131b0 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20  *****/./* Init  
131c0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a             */./*
131d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131e0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
131f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
13230 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
13240 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
13250 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
13260 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
13270 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
13280 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
13290 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
132a0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
132b0 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
132c0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
132d0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
132e0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
132f0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13310 2d 2d 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 0a 20 2a  -------------. *
13340 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
13350 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20  char *blockPtr) 
13360 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
13370 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
13380 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20  )blockPtr;..    
13390 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
133a0 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61  );..    Tls_Clea
133b0 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  n(statePtr);.   
133c0 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72   ckfree(blockPtr
133d0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
133e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13420 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20   *. * Tls_Clean 
13430 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
13440 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
13450 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
13460 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
13470 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
13480 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
13490 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
134a0 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75  ow 1.  This shou
134b0 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20  ld. *.be called 
134c0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79  synchronously by
134d0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20   the CloseProc, 
134e0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76  not in the. *.Ev
134f0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c  entuallyFree cal
13500 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
13510 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
13520 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
13530 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
13540 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
13550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13590 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43  -. */.void Tls_C
135a0 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74  lean(State *stat
135b0 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69  ePtr) {.    dpri
135c0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
135d0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65      /*.     * we
135e0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72  're assuming her
135f0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e  e that we're sin
13600 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20  gle-threaded.   
13610 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61    */.    if (sta
13620 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
13630 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
13640 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
13650 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
13660 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
13670 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
13680 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  mer = NULL;.    
13690 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
136a0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09  Ptr->protos) {..
136b0 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  ckfree(statePtr-
136c0 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65  >protos);..state
136d0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
136e0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
136f0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29   (statePtr->bio)
13700 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c   {../* This will
13710 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f   call SSL_shutdo
13720 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20  wn. Bug 1414045 
13730 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  */..dprintf("BIO
13740 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20  _free_all(%p)", 
13750 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
13760 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74  .BIO_free_all(st
13770 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73  atePtr->bio);..s
13780 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e  tatePtr->bio = N
13790 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
137a0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
137b0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53  ) {..dprintf("SS
137c0 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61  L_free(%p)", sta
137d0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53  tePtr->ssl);..SS
137e0 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  L_free(statePtr-
137f0 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72  >ssl);..statePtr
13800 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ssl = NULL;.  
13810 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
13820 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53  ePtr->ctx) {..SS
13830 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  L_CTX_free(state
13840 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74  Ptr->ctx);..stat
13850 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c  ePtr->ctx = NULL
13860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
13870 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
13880 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  ck) {..Tcl_DecrR
13890 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
138a0 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74  ->callback);..st
138b0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
138c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
138d0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
138e0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63  >password) {..Tc
138f0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
13900 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
13910 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  d);..statePtr->p
13920 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a  assword = NULL;.
13930 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
13940 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a  atePtr->vcmd) {.
13950 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
13960 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  t(statePtr->vcmd
13970 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63  );..statePtr->vc
13980 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  md = NULL;.    }
13990 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
139a0 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a  eturning");.}...
139b0 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  #if TCL_MAJOR_VE
139c0 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e  RSION > 8.#defin
139d0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39  e MIN_VERSION "9
139e0 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .0".#else.#defin
139f0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38  e MIN_VERSION "8
13a00 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  .5".#endif../*. 
13a10 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a50 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49  ----. *. * Tls_I
13a60 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  nit --. *. *.Thi
13a70 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69  s is a package i
13a80 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
13a90 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69  ocedure, which i
13aa0 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54  s called. *.by T
13ab0 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63  cl when this pac
13ac0 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64  kage is to be ad
13ad0 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70  ded to an interp
13ae0 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  reter.. *. * Res
13af0 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69  ults:  Ssl confi
13b00 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64  gured and loaded
13b10 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
13b20 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20  cts:. *. create 
13b30 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c  the ssl command,
13b40 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20   initialize ssl 
13b50 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d  context. *. *---
13b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ba0 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
13bb0 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f  nt Tls_Init(Tcl_
13bc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
13bd0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
13be0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
13bf0 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65  t[] = {.#include
13c00 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78   "tls.tcl.h"..0x
13c10 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64  00.    };..    d
13c20 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
13c30 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43  ;..#ifdef USE_TC
13c40 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28  L_STUBS.    if (
13c50 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
13c60 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f  terp, MIN_VERSIO
13c70 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  N, 0) == NULL) {
13c80 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13c90 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
13ca0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67  .    if (Tcl_Pkg
13cb0 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20  Require(interp, 
13cc0 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49  "Tcl", MIN_VERSI
13cd0 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20  ON, 0) == NULL) 
13ce0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
13cf0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
13d00 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30  if (TlsLibInit(0
13d10 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
13d20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13d30 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20  (interp, "could 
13d40 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53  not initialize S
13d50 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68  SL library", (ch
13d60 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
13d70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13d80 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43      }..    Tcl_C
13d90 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13da0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f  interp, "tls::co
13db0 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65  nnection", Conne
13dc0 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c  ctionInfoObjCmd,
13dd0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
13de0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
13df0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
13e00 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
13e10 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13e20 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b  , "tls::handshak
13e30 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  e", HandshakeObj
13e40 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
13e50 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
13e60 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
13e70 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
13e80 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
13e90 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f  terp, "tls::impo
13ea0 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  rt", ImportObjCm
13eb0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
13ec0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
13ed0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
13ee0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
13ef0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13f00 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c  rp, "tls::misc",
13f10 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c   MiscObjCmd, (Cl
13f20 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
13f30 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
13f40 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
13f50 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
13f60 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
13f70 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55  ls::unimport", U
13f80 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28  nimportObjCmd, (
13f90 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
13fa0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
13fb0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
13fc0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
13fd0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13fe0 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53  "tls::status", S
13ff0 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  tatusObjCmd, (Cl
14000 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
14010 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
14020 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20  oc *) NULL);..  
14030 20 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d    Tls_DigestComm
14040 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20  ands(interp);.  
14050 20 20 54 6c 73 5f 45 6e 63 72 79 70 74 43 6f 6d    Tls_EncryptCom
14060 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20  mands(interp);. 
14070 20 20 20 54 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61     Tls_InfoComma
14080 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nds(interp);.   
14090 20 54 6c 73 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73   Tls_KDFCommands
140a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c  (interp);.    Tl
140b0 73 5f 52 61 6e 64 43 6f 6d 6d 61 6e 64 73 28 69  s_RandCommands(i
140c0 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20  nterp);..    if 
140d0 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f  (interp) {..Tcl_
140e0 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73  Eval(interp, tls
140f0 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a  TclInitScript);.
14100 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
14110 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65  n Tcl_PkgProvide
14120 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45  (interp, PACKAGE
14130 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56  _NAME, PACKAGE_V
14140 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20  ERSION);.}../*. 
14150 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
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 2a 0a 20 2a 0a 20 2a 09 54  -------*. *. *.T
14190 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20  ls_SafeInit --. 
141a0 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *.-----------
141b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141d0 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61  -----*. *.Standa
141e0 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71  rd procedure req
141f0 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e  uired by 'load'.
14200 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
14210 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66  this extension f
14220 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70  or a safe interp
14230 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d  reter.. *.------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
14270 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  *.Side effects:.
14280 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49   *..As of 'Tls_I
14290 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c  nit'. *. *.Resul
142a0 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72  t:. *..A standar
142b0 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65  d Tcl error code
142c0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
142d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
14300 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74  */.DLLEXPORT int
14310 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63   Tls_SafeInit(Tc
14320 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14330 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ) {.    dprintf(
14340 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72  "Called");.    r
14350 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69  eturn(Tls_Init(i
14360 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20  nterp));.}../*. 
14370 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143a0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54  -------*. *. *.T
143b0 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a  lsLibInit --. *.
143c0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
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 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ---*. *.Initiali
14400 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20  zes SSL library 
14410 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61  once per applica
14420 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  tion. *.--------
14430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14450 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
14460 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
14470 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53  ..initializes SS
14480 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09  L library. *. *.
14490 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65  Result:. *..none
144a0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
144e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73  /.static int Tls
144f0 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
14500 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20  itialize) {.    
14510 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69  static int initi
14520 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20  alized = 0;.    
14530 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c  int status = TCL
14540 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  _OK;.#if defined
14550 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
14560 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
14570 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69  _THREADS).    si
14580 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a  ze_t num_locks;.
14590 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
145a0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
145b0 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65  .if (!initialize
145c0 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  d) {..    dprint
145d0 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e  f("Asked to unin
145e0 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65  itialize, but we
145f0 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c   are not initial
14600 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65  ized");...    re
14610 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d  turn(TCL_OK);..}
14620 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65  ...dprintf("Aske
14630 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a  d to uninitializ
14640 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e");..#if define
14650 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
14660 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
14670 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
14680 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
14690 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73  mx);...if (locks
146a0 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f  ) {..    free(lo
146b0 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73  cks);..    locks
146c0 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f   = NULL;..    lo
146d0 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d  cksCount = 0;..}
146e0 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c  .#endif..initial
146f0 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64  ized = 0;..#if d
14700 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
14710 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
14720 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
14730 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
14740 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
14750 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  if...return(TCL_
14760 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OK);.    }..    
14770 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29  if (initialized)
14780 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c   {..dprintf("Cal
14790 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63  led, but using c
147a0 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09  ached value");..
147b0 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a  return(status);.
147c0 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
147d0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23  tf("Called");..#
147e0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
147f0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
14800 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14810 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65  DS).    Tcl_Mute
14820 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  xLock(&init_mx);
14830 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74  .#endif.    init
14840 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69  ialized = 1;..#i
14850 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
14860 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
14870 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
14880 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73  S).    num_locks
14890 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43   = 1;.    locksC
148a0 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d  ount = (int) num
148b0 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b  _locks;.    lock
148c0 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
148d0 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f  f(*locks) * num_
148e0 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73  locks);.    mems
148f0 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a  et(locks, 0, siz
14900 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75  eof(*locks) * nu
14910 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66  m_locks);.#endif
14920 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
14930 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70  ize BOTH libcryp
14940 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a  to and libssl. *
14950 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e  /.    OPENSSL_in
14960 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49  it_ssl(OPENSSL_I
14970 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52  NIT_LOAD_SSL_STR
14980 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  INGS | OPENSSL_I
14990 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f  NIT_LOAD_CRYPTO_
149a0 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53  STRINGS..| OPENS
149b0 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
149c0 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53  CIPHERS | OPENSS
149d0 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44  L_INIT_ADD_ALL_D
149e0 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a  IGESTS, NULL);..
149f0 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28      BIO_new_tcl(
14a00 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30  NULL, 0);..#if 0
14a10 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58  .    /*.     * X
14a20 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20  XX:TODO: Remove 
14a30 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65  this code and re
14a40 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20  place it with a 
14a50 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72  check.     * for
14a60 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20   enough entropy 
14a70 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74  and do not try t
14a80 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
14a90 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65  .     * terrible
14aa0 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f   entropy.     */
14ab0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
14ac0 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e  eed the random n
14ad0 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20  umber generator 
14ae0 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61  in the SSL libra
14af0 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67  ry,.     * using
14b00 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f   the do/while co
14b10 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65 20  nstruct because 
14b20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20  of the bug note 
14b30 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70  in the.     * Op
14b40 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74 74  enSSL FAQ at htt
14b50 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e  p://www.openssl.
14b60 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e  org/support/faq.
14b70 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20  html#USER1.     
14b80 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72 75  *.     * The cru
14b90 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d  x of the problem
14ba0 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73   is that Solaris
14bb0 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65   7 does not have
14bc0 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72   a.     * /dev/r
14bd0 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72  andom or /dev/ur
14be0 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20  andom device so 
14bf0 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72  it cannot gather
14c00 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65   enough.     * e
14c10 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20  ntropy from the 
14c20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e  RAND_seed() when
14c30 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73   TLS initializes
14c40 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20   and refuses.   
14c50 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65    * to go furthe
14c60 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  r. Earlier versi
14c70 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63  ons of OpenSSL c
14c80 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64  arried on regard
14c90 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  less..     */.  
14ca0 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65    srand((unsigne
14cb0 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d  d int) time((tim
14cc0 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20  e_t *) NULL));. 
14cd0 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20     do {..for (i 
14ce0 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b  = 0; i < 16; i++
14cf0 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65  ) {..    rnd_see
14d00 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72  d[i] = 1 + (char
14d10 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28  ) (255.0 * rand(
14d20 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29  )/(RAND_MAX+1.0)
14d30 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64  );..}..RAND_seed
14d40 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f  (rnd_seed, sizeo
14d50 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20  f(rnd_seed));.  
14d60 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f    } while (RAND_
14d70 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a  status() != 1);.
14d80 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
14d90 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
14da0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
14db0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
14dc0 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b   Tcl_MutexUnlock
14dd0 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
14de0 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 73  if..    return(s
14df0 74 61 74 75 73 29 3b 0a 7d 0a                    tatus);.}.