Hex Artifact Content

Artifact 08e7f9d3413203d30e13b3ad3e8dde4697e2eca45413b759359c0b3ec5bd525a:


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 33 30 30 30 30 5d 3b 0a 20 20  uffer[30000];.  
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 23 69 66 20 4f 50 45 4e 53 53 4c 5f  ak;.#if OPENSSL_
1e00: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
1e10: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20 20 20   0x30000000L.   
1e20: 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 5f 48   case DTLS1_RT_H
1e30: 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 65 20  EARTBEAT:..type 
1e40: 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b 0a 09  = "Heartbeat";..
1e50: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20  break;.#endif.  
1e60: 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79 70 65    default:..type
1e70: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
1e80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64    }..    /* Need
1e90: 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f  s compile time o
1ea0: 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73  ption "enable-ss
1eb0: 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20  l-trace". */.   
1ec0: 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f   if ((bio = BIO_
1ed0: 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
1ee0: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  ) != NULL) {..in
1ef0: 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28  t n;..SSL_trace(
1f00: 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e  write_p, version
1f10: 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20  , content_type, 
1f20: 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28  buf, len, ssl, (
1f30: 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20  void *)bio);..n 
1f40: 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20  = BIO_read(bio, 
1f50: 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64  buffer, BIO_pend
1f60: 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30 30 30  ing(bio) < 15000
1f70: 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62   ? BIO_pending(b
1f80: 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e  io) : 14999);..n
1f90: 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e   = (n<0) ? 0 : n
1fa0: 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30  ;..buffer[n] = 0
1fb0: 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75  ;..(void)BIO_flu
1fc0: 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72  sh(bio);..BIO_fr
1fd0: 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20  ee(bio);.   }.. 
1fe0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
1ff0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
2000: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2010: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2020: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
2030: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2040: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2050: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2060: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2070: 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29  ("message", -1))
2080: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2090: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
20a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
20b0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
20c0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
20d0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
20e0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
20f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2100: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2110: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2120: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69  NewStringObj(wri
2130: 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20  te_p ? "Sent" : 
2140: 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29  "Received", -1))
2150: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2160: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2170: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2180: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2190: 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ver, -1));.    T
21a0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
21b0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
21c0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
21d0: 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d  tringObj(type, -
21e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
21f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2200: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2210: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2220: 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
2230: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2240: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2250: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2260: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2270: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
2280: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
2290: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
22a0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
22b0: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64  (cmdPtr);.}.#end
22c0: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2310: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61  . * VerifyCallba
2320: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
2330: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69  tors SSL certifi
2340: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20  cate validation 
2350: 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f  process. Used to
2360: 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09   control the. *.
2370: 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68  behavior when th
2380: 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  e SSL_VERIFY_PEE
2390: 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  R flag is set. T
23a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a  his is called. *
23b0: 09 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74  .whenever a cert
23c0: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65  ificate is inspe
23d0: 63 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20  cted or decided 
23e0: 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20  invalid. Called 
23f0: 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74  for. *.each cert
2400: 69 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63  ificate in the c
2410: 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a  ert chain.. *. *
2420: 20 43 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74   Checks:. *.cert
2430: 69 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73  ificate chain is
2440: 20 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e   checked startin
2450: 67 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65  g with the deepe
2460: 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c  st nesting level
2470: 0a 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20  . *.  (the root 
2480: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20  CA certificate) 
2490: 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72  and worked upwar
24a0: 64 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20  d to the peer's 
24b0: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09  certificate.. *.
24c0: 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61  All signatures a
24d0: 72 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e  re valid, curren
24e0: 74 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e  t time is within
24f0: 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20   first and last 
2500: 76 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20  validity time.. 
2510: 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  *.Check that the
2520: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
2530: 69 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73  issued by the is
2540: 73 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65  suer certificate
2550: 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63   issuer.. *.Chec
2560: 6b 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e  k the revocation
2570: 20 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68   status for each
2580: 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a   certificate.. *
2590: 09 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64  .Check the valid
25a0: 69 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ity of the given
25b0: 20 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72   CRL and the cer
25c0: 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  t revocation sta
25d0: 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  tus.. *.Check th
25e0: 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c  e policies of al
25f0: 6c 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  l the certificat
2600: 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a  es. *. * Args. *
2610: 09 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e  .preverify_ok in
2620: 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20  dicates whether 
2630: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2640: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73  verification pas
2650: 73 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28  sed (1) or not (
2660: 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  0). *. * Results
2670: 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20  :. *.A callback 
2680: 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63  bound to the soc
2690: 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f  ket may return o
26a0: 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09  ne of:. *.    0.
26b0: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63  ..- the certific
26c0: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e  ate is deemed in
26d0: 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69  valid, send veri
26e0: 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20  fication. *.... 
26f0: 20 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74   failure alert t
2700: 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d  o peer, and term
2710: 69 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e  inate handshake.
2720: 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68  . *.    1...- th
2730: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  e certificate is
2740: 20 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63   deemed valid, c
2750: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e  ontinue with han
2760: 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65  dshake.. *.    e
2770: 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f  mpty string.- no
2780: 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69   change to certi
2790: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
27a0: 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  n. *. * Side eff
27b0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72  ects:. *.The err
27c0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
27d0: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76  rrently operativ
27e0: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20  e State is set. 
27f0: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20  *.  to a string 
2800: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53  describing the S
2810: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66  SL negotiation f
2820: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a  ailure reason. *
2830: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
2880: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c  c int.VerifyCall
2890: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30  back(int ok, X50
28a0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78  9_STORE_CTX *ctx
28b0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
28c0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c  *cmdPtr;.    SSL
28d0: 20 20 20 2a 73 73 6c 20 3d 20 28 53 53 4c 2a 29     *ssl = (SSL*)
28e0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
28f0: 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20  et_ex_data(ctx, 
2900: 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f  SSL_get_ex_data_
2910: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69  X509_STORE_CTX_i
2920: 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20  dx());.    X509 
2930: 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53   *cert..= X509_S
2940: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72  TORE_CTX_get_cur
2950: 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a  rent_cert(ctx);.
2960: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
2970: 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr.= (State*)SS
2980: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_get_app_data(s
2990: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  sl);.    Tcl_Int
29a0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
29b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
29c0: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d      int depth..=
29d0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
29e0: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28  get_error_depth(
29f0: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72  ctx);.    int er
2a00: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  r..= X509_STORE_
2a10: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74  CTX_get_error(ct
2a20: 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  x);..    dprintf
2a30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20  ("Called");.    
2a40: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43  dprintf("VerifyC
2a50: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f 6b  allback: %d", ok
2a60: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
2a70: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
2a80: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
2a90: 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 65  ./* Use ok value
2aa0: 20 69 66 20 76 65 72 69 66 69 63 61 74 69 6f 6e   if verification
2ab0: 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   is required */.
2ac0: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76  .if (statePtr->v
2ad0: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49  flags & SSL_VERI
2ae0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
2af0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20  ER_CERT) {..    
2b00: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c  return ok;..} el
2b10: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
2b20: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73   1;..}.    } els
2b30: 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55  e if (cert == NU
2b40: 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c  LL || ssl == NUL
2b50: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  L) {..return 0;.
2b60: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
2b70: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61  tf("VerifyCallba
2b80: 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63  ck: eval callbac
2b90: 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  k");..    /* Cre
2ba0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
2bb0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
2bc0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2bd0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
2be0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
2bf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c00: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2c10: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2c20: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31  Obj("verify", -1
2c30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2c40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c50: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c60: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2c70: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2c80: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2c90: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2ca0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2cb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2cc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2cd0: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b  wIntObj(depth));
2ce0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2cf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2d00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c  terp, cmdPtr, Tl
2d10: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
2d20: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20  erp, cert));.   
2d30: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2d40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2d50: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2d60: 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20  wIntObj(ok));.  
2d70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2d80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2d90: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f  p, cmdPtr,..Tcl_
2da0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
2db0: 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f  ar*)X509_verify_
2dc0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
2dd0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20  g(err), -1));.. 
2de0: 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f     /* Prevent I/
2df0: 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b  O while callback
2e00: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
2e10: 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  */.    /* stateP
2e20: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
2e30: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a  _TCL_CALLBACK; *
2e40: 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  /..    /* Eval c
2e50: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
2e60: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
2e70: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2e80: 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61  .    ok = EvalCa
2e90: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
2ea0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
2eb0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
2ec0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2ed0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65  .    dprintf("Ve
2ee0: 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f  rifyCallback: co
2ef0: 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 25  mmand result = %
2f00: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a  d", ok);..    /*
2f10: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
2f20: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41   &= ~(TLS_TCL_CA
2f30: 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20  LLBACK); */.    
2f40: 72 65 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42  return(ok);./* B
2f50: 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65  y default, leave
2f60: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e   verification un
2f70: 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a  changed. */.}...
2f80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2fd0: 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20  ls_Error --. *. 
2fe0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
2ff0: 20 77 69 74 68 20 6c 69 73 74 20 6f 66 20 65 72   with list of er
3000: 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  rors.. *. * Side
3010: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
3020: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
3030: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
3040: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
3050: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
3060: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
3070: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
3080: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
3090: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
30e0: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74  oid.Tls_Error(St
30f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63  ate *statePtr, c
3100: 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20  har *msg) {.    
3110: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3120: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
3130: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
3140: 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73  bj *cmdPtr, *lis
3150: 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  tPtr;.    unsign
3160: 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20  ed long err;.   
3170: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d   statePtr->err =
3180: 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e   msg;..    dprin
3190: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
31a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
31b0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
31c0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65  l_Obj*)NULL)..re
31d0: 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  turn;..    /* Cr
31e0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
31f0: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
3200: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
3210: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
3220: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54  callback);.    T
3230: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3240: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3250: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3260: 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22  tringObj("error"
3270: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
3280: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3290: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
32a0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
32b0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
32c0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
32d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
32e0: 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67  1));.    if (msg
32f0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
3300: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3310: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3320: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3330: 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29  ingObj(msg, -1))
3340: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ;..    } else if
3350: 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74   ((msg = Tcl_Get
3360: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3370: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3380: 6e 74 65 72 70 29 2c 20 28 54 63 6c 5f 53 69 7a  nterp), (Tcl_Siz
3390: 65 20 2a 29 20 4e 55 4c 4c 29 29 20 21 3d 20 4e  e *) NULL)) != N
33a0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  ULL) {..Tcl_List
33b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
33c0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
33d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
33e0: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20  j(msg, -1));..  
33f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74    } else {..list
3400: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
3410: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
3420: 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52  while ((err = ER
3430: 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21  R_get_error()) !
3440: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
3450: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3460: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
3470: 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
3480: 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f  ingObj(ERR_reaso
3490: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65  n_error_string(e
34a0: 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54  rr), -1));..}..T
34b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
34c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
34d0: 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29  cmdPtr, listPtr)
34e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
34f0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
3500: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
3510: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
3520: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
3530: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
3540: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
3550: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
3560: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3570: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
35c0: 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  . * KeyLogCallba
35d0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74  ck --. *. *.Writ
35e0: 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64  e received key d
35f0: 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e  ata to log file.
3600: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3610: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a  cts:. *.none. *.
3620: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b  -----. */.void K
3670: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f  eyLogCallback(co
3680: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  nst SSL *ssl, co
3690: 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20  nst char *line) 
36a0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20  {.    char *str 
36b0: 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c  = getenv(SSLKEYL
36c0: 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c  OGFILE);.    FIL
36d0: 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69  E *fd;..    dpri
36e0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
36f0: 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09      if (str) {..
3700: 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20  fd = fopen(str, 
3710: 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66  "a");..fprintf(f
3720: 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b  d, "%s\n",line);
3730: 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  ..fclose(fd);.  
3740: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20  . *. * Password 
37a0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
37b0: 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.Called when a 
37c0: 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 70  password for a p
37d0: 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 69  rivate key loadi
37e0: 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 4d  ng/storing a PEM
37f0: 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20  . *.certificate 
3800: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e  with encryption.
3810: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 20   Evals callback 
3820: 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72  script and retur
3830: 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74  ns. *.the result
3840: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64   as the password
3850: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a   string in buf..
3860: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
3870: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
3880: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
3890: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
38a0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
38b0: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73  Returns:. *.Pass
38c0: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74  word size in byt
38d0: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20  es or -1 for an 
38e0: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  error.. *. *----
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3930: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50   */.static int.P
3940: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
3950: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
3960: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c  ize, int rwflag,
3970: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a   void *udata) {.
3980: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
3990: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr.= (State *) 
39a0: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49  udata;.    Tcl_I
39b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
39c0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
39d0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
39e0: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
39f0: 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ode;..    dprint
3a00: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
3a10: 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62    /* If no callb
3a20: 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74  ack, use default
3a30: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20   callback */.   
3a40: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
3a50: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29  assword == NULL)
3a60: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c   {..if (Tcl_Eval
3a70: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  Ex(interp, "tls:
3a80: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20  :password", -1, 
3a90: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3aa0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   == TCL_OK) {.. 
3ab0: 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28     char *ret = (
3ac0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53  char *) Tcl_GetS
3ad0: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
3ae0: 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70  rp);..    strncp
3af0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3b00: 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20  e_t) size);..   
3b10: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72   return (int)str
3b20: 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73  len(ret);..} els
3b30: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e {..    return 
3b40: 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  -1;..}.    }..  
3b50: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3b60: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
3b70: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3b80: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3b90: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
3ba0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3bb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3bc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3bd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3be0: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29  "password", -1))
3bf0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3c00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3c10: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3c20: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66  cl_NewIntObj(rwf
3c30: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  lag));.    Tcl_L
3c40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3c50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3c60: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
3c70: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54  j(size));..    T
3c80: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3c90: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
3ca0: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
3cb0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3cc0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3cd0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3ce0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3cf0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3d00: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3d10: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3d20: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3d30: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3d40: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3d50: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3d60: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3d70: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3d80: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3d90: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3da0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3db0: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3dc0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3dd0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3de0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3df0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3e00: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3e10: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3e20: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3e30: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ePtr);..    /* I
3e40: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61  f successful, pa
3e50: 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64  ss back password
3e60: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e   string and trun
3e70: 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67  cate if too long
3e80: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65   */.    if (code
3e90: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   == TCL_OK) {..T
3ea0: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 09 63 68  cl_Size len;..ch
3eb0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
3ec0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
3ed0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  FromObj(Tcl_GetO
3ee0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
3ef0: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
3f00: 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  n > (Tcl_Size) s
3f10: 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65  ize-1) {..    le
3f20: 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  n = (Tcl_Size) s
3f30: 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63  ize-1;..}..strnc
3f40: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
3f50: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66  ze_t) len);..buf
3f60: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54  [len] = '\0';..T
3f70: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3f80: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
3f90: 0a 09 72 65 74 75 72 6e 28 28 69 6e 74 29 20 6c  ..return((int) l
3fa0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  en);.    }.    T
3fb0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3fc0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
3fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
3fe0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
4030: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62   * Session Callb
4040: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
4050: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
4060: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  when a new sessi
4070: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  on is added to t
4080: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53  he cache. In TLS
4090: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79   1.3. *.this may
40a0: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c   be received mul
40b0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65  tiple times afte
40c0: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  r the handshake.
40d0: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20   For. *.earlier 
40e0: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77  versions, this w
40f0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20  ill be received 
4100: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73  during the hands
4110: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73  hake.. *.This is
4120: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77   the preferred w
4130: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72  ay to obtain a r
4140: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e  esumable session
4150: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4160: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
4170: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4180: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
4190: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
41a0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
41b0: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65   *.0 = error whe
41c0: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20  re session will 
41d0: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  be immediately r
41e0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
41f0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a  internal cache..
4200: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77   *.1 = success w
4210: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73  here app retains
4220: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73   session in sess
4230: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d  ion cache, and m
4240: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53  ust call SSL_SES
4250: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e  SION_free() when
4260: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   done.. *. *----
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
42b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
42c0: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53  essionCallback(S
42d0: 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53  SL *ssl, SSL_SES
42e0: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b  SION *session) {
42f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
4300: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53  ePtr = (State*)S
4310: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
4320: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20  (SSL *)ssl);.   
4330: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4340: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
4350: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
4360: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
4370: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4380: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20  char *ticket;.  
4390: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
43a0: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
43b0: 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  d;.    size_t le
43c0: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  n2;.    unsigned
43d0: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20   int ulen;..    
43e0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
43f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
4400: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
4410: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4420: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4430: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4440: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73     } else if (ss
4450: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  l == NULL) {..re
4460: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4470: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4480: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
4490: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
44a0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
44b0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
44c0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
44d0: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
44e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
44f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4500: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4510: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
4520: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
4530: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4540: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4550: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
4560: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
4570: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
4580: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
4590: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
45a0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
45b0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
45c0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
45d0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
45e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
45f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4600: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4610: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
4620: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
4630: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20  ize) ulen));..  
4640: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63    /* Session tic
4650: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53  ket */.    SSL_S
4660: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
4670: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
4680: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20  ket, &len2);.   
4690: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
46a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
46b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
46c0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
46d0: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
46e0: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a   len2));..    /*
46f0: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62   Lifetime - numb
4700: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f  er of seconds */
4710: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4720: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4730: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
4740: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c  cl_NewLongObj((l
4750: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ong) SSL_SESSION
4760: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
4770: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
4780: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  n)));..    /* Ev
4790: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
47a0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
47b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
47c0: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
47d0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
47e0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
47f0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
4800: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
4810: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c     return 0;.}..
4820: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4870: 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f  ALPN Callback fo
4880: 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50  r Servers and NP
4890: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  N Callback for C
48a0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
48b0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c  Perform protocol
48c0: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20   (http/1.1, h2, 
48d0: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74  h3, etc.) select
48e0: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69  ion for the. *.i
48f0: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
4900: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72  on. Called after
4910: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65   Hello and serve
4920: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09  r callbacks.. *.
4930: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73  Where 'out' is s
4940: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
4950: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65   and 'in' is the
4960: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64   peer advertised
4970: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73   list.. *. * Res
4980: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
4990: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
49a0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
49b0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
49c0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
49d0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
49e0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20  XT_ERR_OK: ALPN 
49f0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
4a00: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
4a10: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
4a20: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
4a30: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72  LERT_FATAL: Ther
4a40: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70  e was no overlap
4a50: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69   between the cli
4a60: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70  ent's. *.    sup
4a70: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74  plied list and t
4a80: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67  he server config
4a90: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  uration. The con
4aa0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  nection will be 
4ab0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f  aborted.. *.SSL_
4ac0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4ad0: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  : ALPN protocol 
4ae0: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e  not selected, e.
4af0: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41  g., because no A
4b00: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f  LPN. *.    proto
4b10: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75  cols are configu
4b20: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e  red for this con
4b30: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  nection. The con
4b40: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4b50: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4ba0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43  static int.ALPNC
4bb0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
4bc0: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
4bd0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
4be0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c  igned char *outl
4bf0: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en,..const unsig
4c00: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e  ned char *in, un
4c10: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e  signed int inlen
4c20: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
4c30: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4c40: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
4c50: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
4c60: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
4c70: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
4c80: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
4c90: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  ;.    int code, 
4ca0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  res;..    dprint
4cb0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
4cc0: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
4cd0: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
4ce0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4cf0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4d00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4d10: 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20  Select protocol 
4d20: 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73  */.    if (SSL_s
4d30: 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  elect_next_proto
4d40: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
4d50: 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c  **) out, outlen,
4d60: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4d70: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  s, statePtr->pro
4d80: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e  tos_len,..in, in
4d90: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f  len) == OPENSSL_
4da0: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20  NPN_NEGOTIATED) 
4db0: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e  {../* Match foun
4dc0: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f  d */..res = SSL_
4dd0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4de0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
4df0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f  OPENSSL_NPN_NO_O
4e00: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72  VERLAP = No over
4e10: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73  lap, so use firs
4e20: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65  t item from clie
4e30: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74  nt protocol list
4e40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4e50: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4e70: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
4e80: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4e90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b  ) {..return res;
4ea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4eb0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4ec0: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
4ed0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4ee0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4ef0: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
4f00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4f10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4f20: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4f30: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
4f40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
4f50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4f60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4f70: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
4f80: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
4f90: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
4fa0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
4fb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4fc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4fd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4fe0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
4ff0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a 6f  const char *) *o
5000: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  ut, -1));.    Tc
5010: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5020: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5030: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f  mdPtr, Tcl_NewBo
5040: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20  oleanObj(res == 
5050: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5060: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  K));..    /* Eva
5070: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
5080: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
5090: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
50a0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
50b0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
50c0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
50d0: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
50e0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
50f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5100: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
5110: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
5120: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5130: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
5140: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5150: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5160: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATAL;.    }.    
5170: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5180: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5190: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
51a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76  ------. *. * Adv
51f0: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73  ertise Protocols
5200: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65   Callback for Ne
5210: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  xt Protocol Nego
5220: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e  tiation (NPN) in
5230: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a   ServerHello --.
5240: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65   *. *.called whe
5250: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e  n a TLS server n
5260: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73  eeds a list of s
5270: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f  upported protoco
5280: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50  ls for Next. *.P
5290: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
52a0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
52b0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
52c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
52d0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
52e0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
52f0: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72  T_ERR_OK: NPN pr
5300: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
5310: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5320: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5330: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5340: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c  CK: NPN protocol
5350: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54   not selected. T
5360: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5370: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  -. */.#ifdef USE
53d0: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a  _NPN.static int.
53e0: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  NPNCallback(cons
53f0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
5400: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5410: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
5420: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69  int *outlen, voi
5430: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
5440: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
5450: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20  (State*)arg;..  
5460: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
5470: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
5480: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
5490: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
54a0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
54b0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
54c0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74  .    /* Set prot
54d0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20  ocols list */.  
54e0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
54f0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
5500: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50  {..*out = stateP
5510: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75  tr->protos;..*ou
5520: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d  tlen = statePtr-
5530: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20  >protos_len;.   
5540: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20   } else {..*out 
5550: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e  = NULL;..*outlen
5560: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53   = 0;..return SS
5570: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5580: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  CK;.    }.    re
5590: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
55a0: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ERR_OK;.}.#endif
55b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5600: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66  * SNI Callback f
5610: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a  or Servers --. *
5620: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76  . *.Perform serv
5630: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74  er-side SNI host
5640: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61  name selection a
5650: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53  fter receiving S
5660: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09  NI extension. *.
5670: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e  in Client Hello.
5680: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65   Called after he
5690: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74  llo callback but
56a0: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c   before ALPN cal
56b0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
56c0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
56d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
56e0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
56f0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
5700: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
5710: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
5720: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68  XT_ERR_OK: SNI h
5730: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70  ostname is accep
5740: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5750: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5760: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5770: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e  _ALERT_FATAL: SN
5780: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
5790: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  t accepted. The 
57a0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20  connection. *.  
57b0: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65    is aborted. De
57c0: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20  fault for alert 
57d0: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f  is SSL_AD_UNRECO
57e0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09  GNIZED_NAME.. *.
57f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5800: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e  LERT_WARNING: SN
5810: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
5820: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e  t accepted, warn
5830: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20  ing alert. *.   
5840: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f   sent (not suppo
5850: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29  rted in TLSv1.3)
5860: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5870: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
5880: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5890: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ACK: SNI hostnam
58a0: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
58b0: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77  d and not acknow
58c0: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65  ledged,. *.    e
58d0: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e  .g. if SNI has n
58e0: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  ot been configur
58f0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5900: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5910: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
5960: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63  c int.SNICallbac
5970: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5980: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
5990: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
59a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
59b0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
59c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
59d0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
59e0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
59f0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
5a00: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
5a10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5a20: 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55  *servername = NU
5a30: 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  LL;..    dprintf
5a40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
5a50: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
5a60: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
5a70: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5a80: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
5aa0: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c  nly works for TL
5ab0: 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65  S 1.2 and earlie
5ac0: 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e  r */.    servern
5ad0: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ame = SSL_get_se
5ae0: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
5af0: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
5b00: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  st_name);.    if
5b10: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c   (!servername ||
5b20: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d   servername[0] =
5b30: 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72  = '\0') {..retur
5b40: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5b50: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
5b60: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5b70: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
5b80: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
5b90: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5ba0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  R_OK;.    }..   
5bb0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
5bc0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
5bd0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5be0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5bf0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5c00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5c10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5c20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5c30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
5c40: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5c50: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5c60: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5c70: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
5c80: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5c90: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5ca0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5cb0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5cc0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5cd0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5ce0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5cf0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20  bj(servername , 
5d00: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
5d10: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5d20: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5d30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5d40: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5d50: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
5d60: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
5d70: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
5d80: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5d90: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5da0: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74  WARNING;..*alert
5db0: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
5dc0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
5dd0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
5de0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
5df0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
5e00: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
5e10: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5e20: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5e30: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5e40: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
5e50: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
5e60: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5e70: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
5e80: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
5e90: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  3 */.    }.    T
5ea0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5eb0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
5ec0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
5ed0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f10: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65  -----. *. * Clie
5f20: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b  ntHello Handshak
5f30: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  e Callback for S
5f40: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
5f50: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74  Used by server t
5f60: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65  o examine the se
5f70: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
5f80: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e  tion (SNI) exten
5f90: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64  sion. *.provided
5fa0: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69   by the client i
5fb0: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63  n order to selec
5fc0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
5fd0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a   certificate to.
5fe0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20   *.present, and 
5ff0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69  make other confi
6000: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d  guration adjustm
6010: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ents relevant to
6020: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09   that server. *.
6030: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e  name and its con
6040: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73  figuration. This
6050: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69   includes swappi
6060: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ng out the assoc
6070: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58  iated. *.SSL_CTX
6080: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79   pointer, modify
6090: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
60a0: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74   list of permitt
60b0: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c  ed TLS versions,
60c0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65  . *.changing the
60d0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72   server's cipher
60e0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73   list in respons
60f0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27  e to the client'
6100: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65  s cipher list, e
6110: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65  tc.. *.Called be
6120: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50  fore SNI and ALP
6130: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a  N callbacks.. *.
6140: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
6150: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
6160: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
6170: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
6180: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
6190: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
61a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
61b0: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68  ETRY: suspend th
61c0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64  e handshake, and
61d0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66   the handshake f
61e0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74  unction will ret
61f0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
6200: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
6210: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75  LLO_ERROR: failu
6220: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
6230: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
6240: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
6250: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
6260: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20  _HELLO_SUCCESS: 
6270: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d  success. *. *---
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
62d0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53  HelloCallback(SS
62e0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
62f0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
6300: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
6310: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
6320: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
6330: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
6340: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
6350: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
6360: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
6370: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
6380: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
6390: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
63a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
63b0: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
63c0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
63d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
63e0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
63f0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
6400: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
6410: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6420: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
6430: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6440: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
6450: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
6460: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
6470: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6480: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6490: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
64a0: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
64b0: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
64c0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
64d0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
64e0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
64f0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
6500: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
6510: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6520: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6530: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
6540: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6550: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6560: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6570: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6580: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6590: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
65a0: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
65b0: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
65c0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
65d0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
65e0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
65f0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6600: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
6610: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
6620: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6630: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6640: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
6650: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
6660: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
6670: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6680: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6690: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
66a0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
66b0: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
66c0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
66d0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
66e0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
66f0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
6700: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6710: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6720: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6730: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6740: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6750: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
6760: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
6770: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6780: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6790: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
67a0: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
67b0: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
67c0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
67d0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
67e0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
67f0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6800: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
6820: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
6830: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6840: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6850: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
6860: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6870: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6880: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6890: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
68a0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
68b0: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
68c0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
68d0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
68e0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
68f0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6900: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
6910: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
6920: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
6930: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
6940: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6950: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6960: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
6970: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c  wStringObj("hell
6980: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
6990: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
69a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
69b0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
69c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
69d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
69e0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
69f0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
6a00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6a10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
6a20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
6a30: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c  gObj(servername,
6a40: 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29   (Tcl_Size) len)
6a50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
6a60: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
6a70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
6a80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6a90: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20  ;.    if ((code 
6aa0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69  = EvalCallback(i
6ab0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
6ac0: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b   cmdPtr)) > 1) {
6ad0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45  ..res = SSL_CLIE
6ae0: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a  NT_HELLO_RETRY;.
6af0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6b00: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52  TLSV1_ALERT_USER
6b10: 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20  _CANCELLED;.    
6b20: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
6b30: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
6b40: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6b50: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65  SUCCESS;.    } e
6b60: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
6b70: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6b80: 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  ROR;..*alert = S
6b90: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6ba0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
6bc0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
6bd0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
6be0: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  res;.}.../******
6bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6c00: 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20  /* Commands     
6c10: 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
6c30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61  -------. *. * Ha
6c80: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d  ndshakeObjCmd --
6c90: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d  . *. *.This comm
6ca0: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76  and is used to v
6cb0: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68  erify whether th
6cc0: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63  e handshake is c
6cd0: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f  omplete. *.or no
6ce0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
6cf0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
6d00: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65  Tcl result. 1 me
6d10: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f  ans handshake co
6d20: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20  mplete, 0 means 
6d30: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53  pending.. *. * S
6d40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6d50: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65  May force SSL ne
6d60: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b  gotiation to tak
6d70: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d  e place.. *. *--
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
6dd0: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
6de0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
6df0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
6e00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
6e10: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
6e20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
6e30: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
6e40: 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  han;        /* T
6e50: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
6e60: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
6e70: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
6e80: 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63  Ptr;        /* c
6e90: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
6ea0: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
6eb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72    const char *er
6ec0: 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  rStr = NULL;.   
6ed0: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20   int ret = 1;.  
6ee0: 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20    int err = 0;. 
6ef0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
6f00: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
6f10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
6f20: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
6f30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
6f40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
6f50: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
6f60: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
6f70: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
6f80: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
6f90: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
6fa0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
6fb0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
6fc0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
6fd0: 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20  v[1], (Tcl_Size 
6fe0: 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b  *) NULL), NULL);
6ff0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
7000: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
7010: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54  ULL) {..return(T
7020: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
7030: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
7040: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
7050: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
7060: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
7070: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
7080: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
7090: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
70a0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
70b0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
70c0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
70d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
70e0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
70f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
7100: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
7110: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
7120: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
7130: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
7140: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
7150: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43   "HANDSHAKE", "C
7160: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
7170: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
7180: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  L);..return(TCL_
7190: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20  ERROR);.    }.  
71a0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
71b0: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
71c0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
71d0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72  (chan);..    dpr
71e0: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c  intf("Calling Tl
71f0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
7200: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c  ");.    ret = Tl
7210: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
7220: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c  (statePtr, &err,
7230: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66   1);.    dprintf
7240: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  ("Tls_WaitForCon
7250: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25  nect returned: %
7260: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69  i", ret);..    i
7270: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28  f (ret < 0 && ((
7280: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
7290: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29  & TLS_TCL_ASYNC)
72a0: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41   && (err == EAGA
72b0: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  IN))) {..dprintf
72c0: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20  ("Async set and 
72d0: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a  err = EAGAIN");.
72e0: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20  .ret = 0;.    } 
72f0: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30  else if (ret < 0
7300: 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  ) {..errStr = st
7310: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
7320: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
7330: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
7340: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
7350: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
7360: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
7370: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
7380: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
7390: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
73a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
73b0: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
73c0: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
73d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
73e0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
73f0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
7400: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46   "HANDSHAKE", "F
7410: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
7420: 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66   NULL);..dprintf
7430: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
7440: 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73  ERROR with hands
7450: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22  hake failed: %s"
7460: 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75  , errStr);..retu
7470: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
7480: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
7490: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
74a0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
74b0: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
74c0: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
74d0: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
74e0: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
74f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
7500: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
7510: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
7520: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
7530: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7540: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
7550: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
7560: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ;.    return(TCL
7570: 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
7580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d  const char *comm
7590: 61 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a  and_opts [] = {.
75a0: 20 20 20 20 22 2d 61 6c 70 6e 22 2c 20 22 2d 63      "-alpn", "-c
75b0: 61 64 69 72 22 2c 20 22 2d 63 61 66 69 6c 65 22  adir", "-cafile"
75c0: 2c 20 22 2d 63 65 72 74 22 2c 20 22 2d 63 65 72  , "-cert", "-cer
75d0: 74 66 69 6c 65 22 2c 20 22 2d 63 69 70 68 65 72  tfile", "-cipher
75e0: 22 2c 20 22 2d 63 69 70 68 65 72 73 22 2c 20 22  ", "-ciphers", "
75f0: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 0a  -ciphersuites",.
7600: 20 20 20 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20      "-command", 
7610: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 22 2d 6b  "-dhparams", "-k
7620: 65 79 22 2c 20 22 2d 6b 65 79 66 69 6c 65 22 2c  ey", "-keyfile",
7630: 20 22 2d 6d 6f 64 65 6c 22 2c 20 22 2d 70 61 73   "-model", "-pas
7640: 73 77 6f 72 64 22 2c 20 22 2d 70 6f 73 74 5f 68  sword", "-post_h
7650: 61 6e 64 73 68 61 6b 65 22 2c 0a 20 20 20 20 22  andshake",.    "
7660: 2d 72 65 71 75 65 73 74 22 2c 20 22 2d 72 65 71  -request", "-req
7670: 75 69 72 65 22 2c 20 22 2d 73 65 63 75 72 69 74  uire", "-securit
7680: 79 5f 6c 65 76 65 6c 22 2c 20 22 2d 73 65 72 76  y_level", "-serv
7690: 65 72 22 2c 20 22 2d 73 65 72 76 65 72 6e 61 6d  er", "-servernam
76a0: 65 22 2c 20 22 2d 73 65 73 73 69 6f 6e 5f 69 64  e", "-session_id
76b0: 22 2c 20 22 2d 73 73 6c 32 22 2c 0a 20 20 20 20  ", "-ssl2",.    
76c0: 22 2d 73 73 6c 33 22 2c 20 22 2d 74 6c 73 31 22  "-ssl3", "-tls1"
76d0: 2c 20 22 2d 74 6c 73 31 2e 31 22 2c 20 22 2d 74  , "-tls1.1", "-t
76e0: 6c 73 31 2e 32 22 2c 20 22 2d 74 6c 73 31 2e 33  ls1.2", "-tls1.3
76f0: 22 2c 20 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d  ", "-validatecom
7700: 6d 61 6e 64 22 2c 20 22 2d 76 63 6d 64 22 2c 20  mand", "-vcmd", 
7710: 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75 6d 20 5f 63 6f  NULL};..enum _co
7720: 6d 6d 61 6e 64 5f 6f 70 74 73 20 7b 0a 20 20 20  mmand_opts {.   
7730: 20 5f 6f 70 74 5f 61 6c 70 6e 2c 20 5f 6f 70 74   _opt_alpn, _opt
7740: 5f 63 61 64 69 72 2c 20 5f 6f 70 74 5f 63 61 66  _cadir, _opt_caf
7750: 69 6c 65 2c 20 5f 6f 70 74 5f 63 65 72 74 2c 20  ile, _opt_cert, 
7760: 5f 6f 70 74 5f 63 65 72 74 66 69 6c 65 2c 20 5f  _opt_certfile, _
7770: 6f 70 74 5f 63 69 70 68 65 72 2c 20 5f 6f 70 74  opt_cipher, _opt
7780: 5f 63 69 70 68 65 72 73 2c 0a 20 20 20 20 5f 6f  _ciphers,.    _o
7790: 70 74 5f 63 69 70 68 65 72 73 75 69 74 65 2c 20  pt_ciphersuite, 
77a0: 5f 6f 70 74 5f 63 6d 64 2c 20 5f 6f 70 74 5f 64  _opt_cmd, _opt_d
77b0: 68 70 61 72 61 6d 73 2c 20 5f 6f 70 74 5f 6b 65  hparams, _opt_ke
77c0: 79 2c 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65 2c  y, _opt_keyfile,
77d0: 20 5f 6f 70 74 5f 6d 6f 64 65 6c 2c 20 5f 6f 70   _opt_model, _op
77e0: 74 5f 70 61 73 73 77 6f 72 64 2c 0a 20 20 20 20  t_password,.    
77f0: 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20  _opt_handshake, 
7800: 5f 6f 70 74 5f 72 65 71 75 65 73 74 2c 20 5f 6f  _opt_request, _o
7810: 70 74 5f 72 65 71 75 69 72 65 2c 20 5f 6f 70 74  pt_require, _opt
7820: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c  _security_level,
7830: 20 5f 6f 70 74 5f 73 65 72 76 65 72 2c 20 5f 6f   _opt_server, _o
7840: 70 74 5f 73 65 72 76 65 72 6e 61 6d 65 2c 0a 20  pt_servername,. 
7850: 20 20 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e 5f     _opt_session_
7860: 69 64 2c 20 5f 6f 70 74 5f 73 73 6c 32 2c 20 5f  id, _opt_ssl2, _
7870: 6f 70 74 5f 73 73 6c 33 2c 20 5f 6f 70 74 5f 74  opt_ssl3, _opt_t
7880: 6c 73 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 31 2c  ls1, _opt_tls11,
7890: 20 5f 6f 70 74 5f 74 6c 73 31 32 2c 20 5f 6f 70   _opt_tls12, _op
78a0: 74 5f 74 6c 73 31 33 2c 0a 20 20 20 20 5f 6f 70  t_tls13,.    _op
78b0: 74 5f 76 61 6c 69 64 61 74 65 2c 20 5f 6f 70 74  t_validate, _opt
78c0: 5f 76 63 6d 64 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d  _vcmd.};../*. *-
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7910: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f  --. *. * ImportO
7920: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
7930: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
7940: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
7950: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f  ess the "ssl" co
7960: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20  mmand. *. *.The 
7970: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68  ssl command push
7980: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e  es SSL over a (n
7990: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20  ewly connected) 
79a0: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a  tcp socket. *. *
79b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
79c0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
79d0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
79e0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
79f0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
7a00: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
7a10: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70  /.static int.Imp
7a70: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
7a80: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
7a90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7aa0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
7ab0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
7ac0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
7ad0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
7ae0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
7af0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
7b00: 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
7b10: 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
7b20: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
7b30: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   socket */.    S
7b40: 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20  SL_CTX *ctx.    
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 63 6d 64 4f 62 6a 09  Tcl_Obj *cmdObj.
7b70: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7b80: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
7b90: 73 77 64 4f 62 6a 09 20 20 20 20 20 20 20 20 3d  swdObj.        =
7ba0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
7bb0: 62 6a 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20  bj *vcmd.       
7bc0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
7bd0: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68  _DString upperCh
7be0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
7bf0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  , upperChannelBl
7c00: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61  ocking, upperCha
7c10: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70  nnelEncoding, up
7c20: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
7c30: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a  r;.    int idx;.
7c40: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 2c      Tcl_Size fn,
7c50: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c   len;.    int fl
7c60: 61 67 73 09 09 20 20 20 20 20 20 20 20 3d 20 54  ags..        = T
7c70: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20  LS_TCL_INIT;.   
7c80: 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 20 20   int server..   
7c90: 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20       = 0;./* is 
7ca0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d  connection incom
7cb0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f  ing or outgoing?
7cc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65   */.    char *ke
7cd0: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  yfile.        = 
7ce0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
7cf0: 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 20 20  certfile.       
7d00: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73   = NULL;.    uns
7d10: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20  igned char *key 
7d20: 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63   .= NULL;.    Tc
7d30: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 20 20  l_Size key_len  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d                 =
7d50: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   0;.    unsigned
7d60: 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 20   char *cert     
7d70: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
7d80: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
7d90: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
7da0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
7db0: 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20  ciphers.        
7dc0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
7dd0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09 20   *ciphersuites. 
7de0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
7df0: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09     char *CAfile.
7e00: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7e10: 20 20 20 20 63 68 61 72 20 2a 43 41 64 69 72 09      char *CAdir.
7e20: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7e30: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
7e40: 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ams.        = NU
7e50: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
7e60: 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d 20 4e  del..        = N
7e70: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  ULL;.    char *s
7e80: 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20  ervername.      
7e90: 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73    = NULL;./* hos
7ea0: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
7eb0: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
7ec0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
7ed0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
7ee0: 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a  sion_id = NULL;.
7ef0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 65 73      Tcl_Size ses
7f00: 73 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  s_len           
7f10: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 54 63       = 0;.    Tc
7f20: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 4f 62 6a 09 09  l_Obj *alpnObj..
7f30: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
7f40: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
7f50: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
7f60: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
7f70: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
7f80: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
7f90: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
7fa0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
7fb0: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
7fc0: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
7fd0: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
7fe0: 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28  shake = 0;.    (
7ff0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
8000: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8010: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
8020: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
8030: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
8040: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
8050: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
8060: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
8070: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
8080: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8090: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
80a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
80b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
80c0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
80d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
80e0: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
80f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
8100: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
8110: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
8120: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
8130: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
8140: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
8150: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
8160: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8170: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8180: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
8190: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
81a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
81b0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
81c0: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
81d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
81e0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
81f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8200: 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a  [1], (Tcl_Size *
8210: 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a  ) NULL), NULL);.
8220: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
8230: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
8240: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
8250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8260: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
8270: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
8280: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
8290: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
82a0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
82b0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66  el(chan);..    f
82c0: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78  or (idx = 2; idx
82d0: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20   < objc; idx++) 
82e0: 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  {..if (Tcl_GetIn
82f0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
8300: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f  p, objv[idx], co
8310: 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74  mmand_opts, "opt
8320: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d  ion", 0, &fn) !=
8330: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
8340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8350: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61  ;..}.../* Valida
8360: 74 65 20 61 72 67 20 68 61 73 20 76 61 6c 75 65  te arg has value
8370: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e   */..if (++idx >
8380: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54  = objc) {..    T
8390: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
83a0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75  interp, "No valu
83b0: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22  e for option \""
83c0: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66  , command_opts[f
83d0: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20  n], "\"", (char 
83e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
83f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8400: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29  ..}...switch(fn)
8410: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 61 6c   {..case _opt_al
8420: 70 6e 3a 0a 09 20 20 20 20 61 6c 70 6e 4f 62 6a  pn:..    alpnObj
8430: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20   = objv[idx];.. 
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 64 69 72 3a 0a 09 20 20 20  _opt_cadir:..   
8460: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28   GET_OPT_STRING(
8470: 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 64 69 72  objv[idx], CAdir
8480: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
8490: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
84a0: 63 61 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 54  cafile:..    GET
84b0: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76  _OPT_STRING(objv
84c0: 5b 69 64 78 5d 2c 20 43 41 66 69 6c 65 2c 20 4e  [idx], CAfile, N
84d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ULL);..    break
84e0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 65 72  ;..case _opt_cer
84f0: 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  t:..    GET_OPT_
8500: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b  BYTE_ARRAY(objv[
8510: 69 64 78 5d 2c 20 63 65 72 74 2c 20 26 63 65 72  idx], cert, &cer
8520: 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  t_len);..    bre
8530: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  ak;..case _opt_c
8540: 65 72 74 66 69 6c 65 3a 0a 09 20 20 20 20 47 45  ertfile:..    GE
8550: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
8560: 76 5b 69 64 78 5d 2c 20 63 65 72 74 66 69 6c 65  v[idx], certfile
8570: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
8580: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8590: 63 69 70 68 65 72 3a 0a 09 63 61 73 65 20 5f 6f  cipher:..case _o
85a0: 70 74 5f 63 69 70 68 65 72 73 3a 0a 09 20 20 20  pt_ciphers:..   
85b0: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28   GET_OPT_STRING(
85c0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68 65  objv[idx], ciphe
85d0: 72 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  rs, NULL);..    
85e0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
85f0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 3a 0a 09  t_ciphersuite:..
8600: 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49      GET_OPT_STRI
8610: 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69  NG(objv[idx], ci
8620: 70 68 65 72 73 75 69 74 65 73 2c 20 4e 55 4c 4c  phersuites, NULL
8630: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8640: 63 61 73 65 20 5f 6f 70 74 5f 63 6d 64 3a 0a 09  case _opt_cmd:..
8650: 20 20 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a      cmdObj = obj
8660: 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65  v[idx];..    bre
8670: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64  ak;..case _opt_d
8680: 68 70 61 72 61 6d 73 3a 0a 09 20 20 20 20 47 45  hparams:..    GE
8690: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
86a0: 76 5b 69 64 78 5d 2c 20 44 48 70 61 72 61 6d 73  v[idx], DHparams
86b0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
86c0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
86d0: 6b 65 79 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  key:..    GET_OP
86e0: 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a  T_BYTE_ARRAY(obj
86f0: 76 5b 69 64 78 5d 2c 20 6b 65 79 2c 20 26 6b 65  v[idx], key, &ke
8700: 79 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  y_len);..    bre
8710: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b  ak;..case _opt_k
8720: 65 79 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 54  eyfile:..    GET
8730: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76  _OPT_STRING(objv
8740: 5b 69 64 78 5d 2c 20 6b 65 79 66 69 6c 65 2c 20  [idx], keyfile, 
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 6d 6f  k;..case _opt_mo
8770: 64 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  del:..    GET_OP
8780: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
8790: 78 5d 2c 20 6d 6f 64 65 6c 2c 20 4e 55 4c 4c 29  x], model, NULL)
87a0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
87b0: 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72  ase _opt_passwor
87c0: 64 3a 0a 09 20 20 20 20 70 61 73 73 77 64 4f 62  d:..    passwdOb
87d0: 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09  j = objv[idx];..
87e0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
87f0: 20 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 3a   _opt_handshake:
8800: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f  ..    GET_OPT_BO
8810: 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 70  OL(objv[idx], &p
8820: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a  ost_handshake);.
8830: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8840: 65 20 5f 6f 70 74 5f 72 65 71 75 65 73 74 3a 0a  e _opt_request:.
8850: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f  .    GET_OPT_BOO
8860: 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 65  L(objv[idx], &re
8870: 71 75 65 73 74 29 3b 0a 09 20 20 20 20 62 72 65  quest);..    bre
8880: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72  ak;..case _opt_r
8890: 65 71 75 69 72 65 3a 0a 09 20 20 20 20 47 45 54  equire:..    GET
88a0: 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69  _OPT_BOOL(objv[i
88b0: 64 78 5d 2c 20 26 72 65 71 75 69 72 65 29 3b 0a  dx], &require);.
88c0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
88d0: 65 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 5f  e _opt_security_
88e0: 6c 65 76 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f  level:..    GET_
88f0: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
8900: 5d 2c 20 26 6c 65 76 65 6c 29 3b 0a 09 20 20 20  ], &level);..   
8910: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8920: 70 74 5f 73 65 72 76 65 72 3a 0a 09 20 20 20 20  pt_server:..    
8930: 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a  GET_OPT_BOOL(obj
8940: 76 5b 69 64 78 5d 2c 20 26 73 65 72 76 65 72 29  v[idx], &server)
8950: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8960: 61 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72 6e  ase _opt_servern
8970: 61 6d 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ame:..    GET_OP
8980: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
8990: 78 5d 2c 20 73 65 72 76 65 72 6e 61 6d 65 2c 20  x], servername, 
89a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
89b0: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65  k;..case _opt_se
89c0: 73 73 69 6f 6e 5f 69 64 3a 0a 09 20 20 20 20 47  ssion_id:..    G
89d0: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41  ET_OPT_BYTE_ARRA
89e0: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65 73  Y(objv[idx], ses
89f0: 73 69 6f 6e 5f 69 64 2c 20 26 73 65 73 73 5f 6c  sion_id, &sess_l
8a00: 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  en);..    break;
8a10: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c 32  ..case _opt_ssl2
8a20: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49  :..    GET_OPT_I
8a30: 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 73  NT(objv[idx], &s
8a40: 73 6c 32 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  sl2);..    break
8a50: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c  ;..case _opt_ssl
8a60: 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  3:..    GET_OPT_
8a70: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8a80: 73 73 6c 33 29 3b 0a 09 20 20 20 20 62 72 65 61  ssl3);..    brea
8a90: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c  k;..case _opt_tl
8aa0: 73 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  s1:..    GET_OPT
8ab0: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  _INT(objv[idx], 
8ac0: 26 74 6c 73 31 29 3b 0a 09 20 20 20 20 62 72 65  &tls1);..    bre
8ad0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74  ak;..case _opt_t
8ae0: 6c 73 31 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f  ls11:..    GET_O
8af0: 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d  PT_INT(objv[idx]
8b00: 2c 20 26 74 6c 73 31 5f 31 29 3b 0a 09 20 20 20  , &tls1_1);..   
8b10: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8b20: 70 74 5f 74 6c 73 31 32 3a 0a 09 20 20 20 20 47  pt_tls12:..    G
8b30: 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b  ET_OPT_INT(objv[
8b40: 69 64 78 5d 2c 20 26 74 6c 73 31 5f 32 29 3b 0a  idx], &tls1_2);.
8b50: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8b60: 65 20 5f 6f 70 74 5f 74 6c 73 31 33 3a 0a 09 20  e _opt_tls13:.. 
8b70: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f     GET_OPT_INT(o
8b80: 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f  bjv[idx], &tls1_
8b90: 33 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  3);..    break;.
8ba0: 09 63 61 73 65 20 5f 6f 70 74 5f 76 61 6c 69 64  .case _opt_valid
8bb0: 61 74 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f  ate:..case _opt_
8bc0: 76 63 6d 64 3a 0a 09 20 20 20 20 76 63 6d 64 20  vcmd:..    vcmd 
8bd0: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
8be0: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
8bf0: 7d 0a 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  }..    if (reque
8c00: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53  st)..verify |= S
8c10: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
8c20: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
8c30: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
8c40: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
8c50: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ire).verify |= S
8c60: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
8c70: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
8c80: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
8c90: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
8ca0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e).verify |= SSL
8cb0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
8cc0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28  DSHAKE;.    if (
8cd0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65  verify == 0)..ve
8ce0: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46  rify = SSL_VERIF
8cf0: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f  Y_NONE;..    pro
8d00: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c  to |= (ssl2 ? TL
8d10: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30  S_PROTO_SSL2 : 0
8d20: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
8d30: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl3 ? TLS_PROT
8d40: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20  O_SSL3 : 0);.   
8d50: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20   proto |= (tls1 
8d60: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
8d70: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
8d80: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c   |= (tls1_1 ? TL
8d90: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a  S_PROTO_TLS1_1 :
8da0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
8db0: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f  = (tls1_2 ? TLS_
8dc0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30  PROTO_TLS1_2 : 0
8dd0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
8de0: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52  (tls1_3 ? TLS_PR
8df0: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b  OTO_TLS1_3 : 0);
8e00: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74  ..    /* reset t
8e10: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20  o NULL if blank 
8e20: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20  string provided 
8e30: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20  */.    if (cert 
8e40: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20  && !*cert)..    
8e50: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20      cert.       
8e60: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
8e70: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09  (key && !*key)..
8e80: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20          key.    
8e90: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8ea0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20  if (certfile && 
8eb0: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20  !*certfile)     
8ec0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e      certfile.= N
8ed0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
8ee0: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c  file && !*keyfil
8ef0: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20  e)..keyfile.    
8f00: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8f10: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21  if (ciphers && !
8f20: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20  *ciphers).      
8f30: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20    ciphers.      
8f40: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
8f50: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26   (ciphersuites &
8f60: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73  & !*ciphersuites
8f70: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20  ) ciphersuites  
8f80: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
8f90: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41   (CAfile && !*CA
8fa0: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41  file).        CA
8fb0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
8fc0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64  ULL;.    if (CAd
8fd0: 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20  ir && !*CAdir). 
8fe0: 20 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20         CAdir.   
8ff0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9000: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26   if (DHparams &&
9010: 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20   !*DHparams).   
9020: 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20       DHparams   
9030: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20       = NULL;..  
9040: 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61    /* new SSL sta
9050: 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  te */.    stateP
9060: 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20  tr..= (State *) 
9070: 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65  ckalloc((unsigne
9080: 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29  d) sizeof(State)
9090: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74  );.    memset(st
90a0: 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f  atePtr, 0, sizeo
90b0: 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20  f(State));..    
90c0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09  statePtr->flags.
90d0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61  = flags;.    sta
90e0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20  tePtr->interp.= 
90f0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74  interp;.    stat
9100: 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76  ePtr->vflags.= v
9110: 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65  erify;.    state
9120: 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a  Ptr->err.= "";..
9130: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
9140: 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66  script */.    if
9150: 20 28 63 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c   (cmdObj != NULL
9160: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
9170: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9180: 28 63 6d 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a  (cmdObj, &len);.
9190: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
91a0: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62   statePtr->callb
91b0: 61 63 6b 20 3d 20 63 6d 64 4f 62 6a 3b 0a 09 20  ack = cmdObj;.. 
91c0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
91d0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61  unt(statePtr->ca
91e0: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20  llback);..}.    
91f0: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  }..    /* alloca
9200: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20  te password */. 
9210: 20 20 20 69 66 20 28 70 61 73 73 77 64 4f 62 6a     if (passwdObj
9220: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f   != NULL) {..(vo
9230: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
9240: 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 64 4f  gFromObj(passwdO
9250: 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  bj, &len);..if (
9260: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
9270: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
9280: 20 70 61 73 73 77 64 4f 62 6a 3b 0a 09 20 20 20   passwdObj;..   
9290: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
92a0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
92b0: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
92c0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
92d0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
92e0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
92f0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
9300: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
9310: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
9320: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
9330: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
9340: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
9350: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
9360: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
9370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
9380: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
9390: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
93a0: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
93b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
93c0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
93d0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
93e0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
93f0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
9400: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
9410: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
9420: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
9430: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9440: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
9450: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
9460: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
9470: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
9480: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
9490: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
94a0: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
94b0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
94c0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
94d0: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
94e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
94f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
9500: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
9510: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
9520: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
9530: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
9540: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
9550: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
9560: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
9570: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  T", "CHANNEL", "
9580: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
9590: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
95a0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
95b0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
95c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
95d0: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53  R;..}..ctx = ((S
95e0: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
95f0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
9600: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20  a(chan))->ctx;. 
9610: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
9620: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74  ((ctx = CTX_Init
9630: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65  (statePtr, serve
9640: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c  r, proto, keyfil
9650: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79  e, certfile, key
9660: 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65  , cert, (int) ke
9670: 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74  y_len,..    (int
9680: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69  ) cert_len, CAdi
9690: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65  r, CAfile, ciphe
96a0: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  rs, ciphersuites
96b0: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d  , level, DHparam
96c0: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  s)) == NULL) {..
96d0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
96e0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
96f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
9700: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
9710: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
9720: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20  ctx = ctx;..    
9730: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
9740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
9750: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hat the channel 
9760: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20  works in binary 
9770: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20  (for the.     * 
9780: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74  encryption not t
9790: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29  o get goofed up)
97a0: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79  ..     * We only
97b0: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20   want to adjust 
97c0: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e  the buffering in
97d0: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73   pre-v2 channels
97e0: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65  , where.     * e
97f0: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74  ach channel in t
9800: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69  he stack maintai
9810: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66  ned its own buff
9820: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ers..     */.   
9830: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
9840: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
9850: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
9860: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
9870: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
9880: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
9890: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
98a0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
98b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
98c0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
98d0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
98e0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
98f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9900: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
9910: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
9920: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
9930: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
9940: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
9950: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
9960: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
9970: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
9980: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9990: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
99a0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
99b0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
99c0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
99d0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
99e0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
99f0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
9a00: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
9a10: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9a20: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9a30: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
9a40: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
9a50: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
9a60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9a70: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
9a80: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
9a90: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
9aa0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
9ab0: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
9ac0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
9ad0: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
9ae0: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
9af0: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
9b00: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
9b10: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
9b20: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54  a) statePtr,..(T
9b30: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
9b40: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
9b50: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
9b60: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
9b70: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
9b80: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
9b90: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
9ba0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
9bb0: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
9bc0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9bd0: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
9be0: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
9bf0: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
9c00: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
9c10: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
9c20: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
9c30: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
9c40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9c50: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74    }..    Tcl_Set
9c60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9c70: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9c80: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
9c90: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
9ca0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9cb0: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
9cc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9cd0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9ce0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
9cf0: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
9d00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
9d10: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
9d20: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
9d30: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
9d40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
9d50: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
9d60: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
9d70: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
9d80: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
9d90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9da0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9db0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
9dc0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
9dd0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9de0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
9df0: 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a  cking));..    /*
9e00: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
9e10: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
9e20: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
9e30: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
9e40: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
9e50: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
9e60: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
9e70: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
9e80: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
9e90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
9ea0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
9eb0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
9ec0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
9ed0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
9ee0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
9ef0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
9f00: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
9f10: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44   "INIT", "FAILED
9f20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9f30: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68  );..Tls_Free((ch
9f40: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
9f50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9f60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
9f70: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65  * Set host serve
9f80: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66  r name */.    if
9f90: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a   (servername) {.
9fa0: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72  ./* Sets the ser
9fb0: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74  ver name indicat
9fc0: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69  ion (SNI) in Cli
9fd0: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69  entHello extensi
9fe0: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46  on */../* Per RF
9ff0: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65  C 6066, hostname
a000: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f   is a ASCII enco
a010: 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75  ded string, thou
a020: 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73  gh RFC 4366 says
a030: 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28   UTF-8. */..if (
a040: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f  !SSL_set_tlsext_
a050: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50  host_name(stateP
a060: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
a070: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29  ame) && require)
a080: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a090: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a0a0: 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73   "Set SNI extens
a0b0: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ion failed: ", G
a0c0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
a0d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a0e0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a0f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a100: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a110: 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c  "SNI", "FAILED",
a120: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a130: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
a140: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
a150: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
a160: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
a170: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66  * Set hostname f
a180: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63  or peer certific
a190: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72  ate hostname ver
a1a0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69  ification in cli
a1b0: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20  ents...   Don't 
a1c0: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73  use SSL_set1_hos
a1d0: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c  t since it has l
a1e0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09  imitations. */..
a1f0: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f  if (!SSL_add1_ho
a200: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  st(statePtr->ssl
a210: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b  , servername)) {
a220: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
a230: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a240: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65  Set DNS hostname
a250: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
a260: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
a270: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a280: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
a290: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
a2a0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f  ", "IMPORT", "HO
a2b0: 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44  STNAME", "FAILED
a2c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a2d0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
a2e0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a2f0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
a300: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
a310: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
a320: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a  ume session id *
a330: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  /.    if (sessio
a340: 6e 5f 69 64 20 26 26 20 73 65 73 73 5f 6c 65 6e  n_id && sess_len
a350: 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f   <= SSL_MAX_SID_
a360: 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f  CTX_LENGTH) {../
a370: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f  * SSL_set_sessio
a380: 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  n() */..if (!SSL
a390: 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64  _SESSION_set1_id
a3a0: 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74  _context(SSL_get
a3b0: 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74  _session(statePt
a3c0: 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e  r->ssl), session
a3d0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  _id, (unsigned i
a3e0: 6e 74 29 20 73 65 73 73 5f 6c 65 6e 29 29 20 7b  nt) sess_len)) {
a3f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
a400: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a410: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66  Resume session f
a420: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
a430: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
a440: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a450: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
a460: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
a470: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53   "IMPORT", "SESS
a480: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  ION", "FAILED", 
a490: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
a4a0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
a4b0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
a4c0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a4d0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
a4e0: 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  }..    /* Enable
a4f0: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79   Application-Lay
a500: 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  er Protocol Nego
a510: 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65  tiation. Example
a520: 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c  s are: http/1.0,
a530: 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20  ..http/1.1, h2, 
a540: 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70  h3, ftp, imap, p
a550: 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74  op3, xmpp-client
a560: 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d  , xmpp-server, m
a570: 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a  qtt, irc, etc. *
a580: 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 4f 62  /.    if (alpnOb
a590: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  j != NULL) {../*
a5a0: 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c   Convert a TCL l
a5b0: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f  ist into a proto
a5c0: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65  col-list in wire
a5d0: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69  -format */..unsi
a5e0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
a5f0: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64  s, *p;..unsigned
a600: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20   int protos_len 
a610: 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63  = 0;..Tcl_Size c
a620: 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09  nt, i;..int j;..
a630: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a  Tcl_Obj **list;.
a640: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62  ..if (Tcl_ListOb
a650: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
a660: 65 72 70 2c 20 61 6c 70 6e 4f 62 6a 2c 20 26 63  erp, alpnObj, &c
a670: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43  nt, &list) != TC
a680: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73  L_OK) {..    Tls
a690: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a6a0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a6b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a6c0: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
a6d0: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  ne the memory re
a6e0: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70  quired for the p
a6f0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
a700: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
a710: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
a720: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
a730: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20  romObj(list[i], 
a740: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
a750: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54  len > 255) {...T
a760: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a770: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72  interp, "ALPN pr
a780: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f  otocol names too
a790: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29   long", (char *)
a7a0: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65   NULL);...Tcl_Se
a7b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
a7c0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
a7d0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49  T", "ALPN", "FAI
a7e0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
a7f0: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65  ULL);...Tls_Free
a800: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a810: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  tr);...return TC
a820: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
a830: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20  .    protos_len 
a840: 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e  += 1 + (int) len
a850: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
a860: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
a870: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
a880: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
a890: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
a8a0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
a8b0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
a8c0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
a8d0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
a8e0: 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70  /..for (j = 0, p
a8f0: 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63   = protos; j < c
a900: 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; j++) {..    
a910: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
a920: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a930: 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b  (list[j], &len);
a940: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e  ..    *p++ = (un
a950: 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e  signed char) len
a960: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
a970: 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c   str, (size_t) l
a980: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c  en);..    p += l
a990: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f  en;..}.../* SSL_
a9a0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20  set_alpn_protos 
a9b0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20  makes a copy of 
a9c0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
a9d0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54  t */../* Note: T
a9e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
a9f0: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72  verses the retur
aa00: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69  n value conventi
aa10: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73  on */..if (SSL_s
aa20: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73  et_alpn_protos(s
aa30: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72  tatePtr->ssl, pr
aa40: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e  otos, protos_len
aa50: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
aa60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
aa70: 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f  p, "Set ALPN pro
aa80: 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22  tocols failed: "
aa90: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
aaa0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
aab0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
aac0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
aad0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
aae0: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
aaf0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
ab00: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
ab10: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
ab20: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72  ePtr);..    ckfr
ab30: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20  ee(protos);..   
ab40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ab50: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65  R;..}.../* Store
ab60: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
ab70: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  */..statePtr->pr
ab80: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09  otos = protos;..
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 70 72 6f 74 6f 73 5f 6c 65  _len = protos_le
abb0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
abc0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
abd0: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65  s = NULL;..state
abe0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
abf0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
ac00: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
ac10: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
ac20: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f      SSL_set_app_
ac30: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73  data(statePtr->s
ac40: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
ac50: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20  ePtr);./* point 
ac60: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a 20  back to us */.. 
ac70: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66     SSL_set_verif
ac80: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  y(statePtr->ssl,
ac90: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43   verify, VerifyC
aca0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
acb0: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62  L_set_info_callb
acc0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ack(statePtr->ss
acd0: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29  l, InfoCallback)
ace0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61  ;..    /* Callba
acf0: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67  ck for observing
ad00: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67   protocol messag
ad10: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50  es */.#ifndef OP
ad20: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41  ENSSL_NO_SSL_TRA
ad30: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53  CE.    /* void S
ad40: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63  SL_CTX_set_msg_c
ad50: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74  allback_arg(stat
ad60: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64  ePtr->ctx, (void
ad70: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20   *)statePtr);.  
ad80: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73    void SSL_CTX_s
ad90: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28  et_msg_callback(
ada0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d  statePtr->ctx, M
adb0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b  essageCallback);
adc0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
add0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
ade0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
adf0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
ae00: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d  );.    SSL_set_m
ae10: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  sg_callback(stat
ae20: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61  ePtr->ssl, Messa
ae30: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e  geCallback);.#en
ae40: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  dif..    /* Crea
ae50: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42  te Tcl_Channel B
ae60: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  IO Handler */.  
ae70: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
ae80: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28  o.= BIO_new_tcl(
ae90: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f  statePtr, BIO_NO
aea0: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74  CLOSE);.    stat
aeb0: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f  ePtr->bio.= BIO_
aec0: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29  new(BIO_f_ssl())
aed0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  ;..    if (serve
aee0: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20  r) {../* Server 
aef0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53  callbacks */..SS
af00: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74  L_CTX_set_tlsext
af10: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28  _servername_arg(
af20: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28  statePtr->ctx, (
af30: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
af40: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  ;..SSL_CTX_set_t
af50: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
af60: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
af70: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c  tr->ctx, SNICall
af80: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  back);..SSL_CTX_
af90: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  set_client_hello
afa0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
afb0: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b  x, HelloCallback
afc0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
afd0: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50  tr);..if (stateP
afe0: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55  tr->protos != NU
aff0: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43  LL) {..    SSL_C
b000: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65  TX_set_alpn_sele
b010: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
b020: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
b030: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
b040: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45  Ptr);.#ifdef USE
b050: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c  _NPN..    if (tl
b060: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73  s1_2 == 0 && tls
b070: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53  1_3 == 0) {...SS
b080: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70  L_CTX_set_next_p
b090: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64  rotos_advertised
b0a0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
b0b0: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  x, NPNCallback, 
b0c0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
b0d0: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66  );..    }.#endif
b0e0: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  ..}.../* Enable 
b0f0: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63  server to send c
b100: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65  ert request afte
b110: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53  r handshake (TLS
b120: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f   1.3 only) */../
b130: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74  * A write operat
b140: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c  ion must take pl
b150: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74  ace for the Cert
b160: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20  ificate Request 
b170: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74  to be..   sent t
b180: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68  o the client, th
b190: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77  is can be done w
b1a0: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73  ith SSL_do_hands
b1b0: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28  hake(). */..if (
b1c0: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f  request && post_
b1d0: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73  handshake && tls
b1e0: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  1_3) {..    SSL_
b1f0: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f  verify_client_po
b200: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61  st_handshake(sta
b210: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a  tePtr->ssl);..}.
b220: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74  ../* set automat
b230: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69  ic curve selecti
b240: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65  on */..SSL_set_e
b250: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74  cdh_auto(statePt
b260: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a  r->ssl, 1);.../*
b270: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65   Set server mode
b280: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66   */..statePtr->f
b290: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
b2a0: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74  SERVER;..SSL_set
b2b0: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74  _accept_state(st
b2c0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
b2d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43    } else {../* C
b2e0: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20  lient callbacks 
b2f0: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
b300: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  N..if (statePtr-
b310: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20  >protos != NULL 
b320: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  && tls1_2 == 0 &
b330: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
b340: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
b350: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c  t_next_proto_sel
b360: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
b370: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
b380: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
b390: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  ePtr);..}.#endif
b3a0: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61  .../* Session ca
b3b0: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54  ching */..SSL_CT
b3c0: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_set_session_ca
b3d0: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
b3e0: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53  r->ctx, SSL_SESS
b3f0: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20  _CACHE_CLIENT | 
b400: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e  SSL_SESS_CACHE_N
b410: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45  O_INTERNAL_STORE
b420: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73  );..SSL_CTX_sess
b430: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74  _set_new_cb(stat
b440: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69  ePtr->ctx, Sessi
b450: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f  onCallback);.../
b460: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61  * Enable post ha
b470: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69  ndshake Authenti
b480: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e  cation extension
b490: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20  . TLS 1.3 only, 
b4a0: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09  not http/2. */..
b4b0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
b4c0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b  ost_handshake) {
b4d0: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f  ..    SSL_set_po
b4e0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74  st_handshake_aut
b4f0: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  h(statePtr->ssl,
b500: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74   1);..}.../* Set
b510: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a   client mode */.
b520: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74  .SSL_set_connect
b530: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
b540: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
b550: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61   SSL_set_bio(sta
b560: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74  tePtr->ssl, stat
b570: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61  ePtr->p_bio, sta
b580: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20  tePtr->p_bio);. 
b590: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73     BIO_set_ssl(s
b5a0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74  tatePtr->bio, st
b5b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f  atePtr->ssl, BIO
b5c0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20  _NOCLOSE);..    
b5d0: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66  /*.     * End of
b5e0: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a   SSL Init.     *
b5f0: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  /.    dprintf("R
b600: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63  eturning %s", Tc
b610: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
b620: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
b630: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  );.    Tcl_SetRe
b640: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
b650: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  ar *) Tcl_GetCha
b660: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
b670: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f  r->self), TCL_VO
b680: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65  LATILE);..    re
b690: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
b6a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
b6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
b6f0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
b700: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
b710: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
b720: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
b730: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
b740: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
b750: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
b760: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
b770: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
b780: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
b790: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
b7a0: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
b7b0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
b7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
b800: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
b810: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
b820: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
b830: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b840: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
b850: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
b860: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
b870: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
b880: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
b890: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
b8a0: 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  /.    (void) cli
b8b0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
b8c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
b8d0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
b8e0: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
b8f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b900: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
b910: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
b920: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
b930: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
b940: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
b950: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
b960: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
b970: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
b980: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
b990: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
b9a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b9b0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
b9c0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
b9d0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
b9e0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
b9f0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
ba00: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
ba10: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
ba20: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
ba30: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
ba40: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
ba50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ba60: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
ba70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
ba80: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
ba90: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
baa0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  nel", NULL);..  
bab0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
bac0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
bad0: 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43  , "UNIMPORT", "C
bae0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
baf0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
bb00: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
bb10: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
bb20: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63    if (Tcl_Unstac
bb30: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
bb40: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52   chan) == TCL_ER
bb50: 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ROR) {..return T
bb60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
bb70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
bb80: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
bb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbd0: 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20  . *. * CTX_Init 
bbe0: 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53  -- construct a S
bbf0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a  SL_CTX instance.
bc00: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
bc10: 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54  *.A valid SSL_CT
bc20: 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55  X instance or NU
bc30: 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  LL.. *. * Side e
bc40: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
bc50: 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78  ructs SSL contex
bc60: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d  t (CTX). *. *---
bc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcb0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f  . */.static SSL_
bcc0: 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53  CTX *.CTX_Init(S
bcd0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
bce0: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e  int isServer, in
bcf0: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b  t proto, char *k
bd00: 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65  eyfile, char *ce
bd10: 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69  rtfile,.    unsi
bd20: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20  gned char *key, 
bd30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
bd40: 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e  ert, int key_len
bd50: 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20  , int cert_len, 
bd60: 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20  char *CAdir,.   
bd70: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63   char *CAfile, c
bd80: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68  har *ciphers, ch
bd90: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
bda0: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61  , int level, cha
bdb0: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20  r *DHparams) {. 
bdc0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
bdd0: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72  nterp = statePtr
bde0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53  ->interp;.    SS
bdf0: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
be00: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
be10: 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44  ng ds;.    Tcl_D
be20: 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20  String ds1;.    
be30: 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20  int off = 0;.   
be40: 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74   int load_privat
be50: 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74  e_key;.    const
be60: 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74   SSL_METHOD *met
be70: 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  hod;..    dprint
be80: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
be90: 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a    if (!proto) {.
bea0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
beb0: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61  t(interp, "no va
bec0: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  lid protocol sel
bed0: 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  ected", (char *)
bee0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
bef0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
bf00: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63   /* create SSL c
bf10: 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50  ontext */.#if OP
bf20: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
bf30: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30  MBER >= 0x101000
bf40: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e  00L || defined(N
bf50: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e  O_SSL2) || defin
bf60: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
bf70: 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  L2).    if (ENAB
bf80: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
bf90: 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54  ROTO_SSL2)) {..T
bfa0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bfb0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72  interp, "SSL2 pr
bfc0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
bfd0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
bfe0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
bff0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
c000: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
c010: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
c020: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
c030: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
c040: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
c050: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63  OTO_SSL3)) {..Tc
c060: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c070: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f  nterp, "SSL3 pro
c080: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
c090: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
c0a0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
c0b0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
c0c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
c0d0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
c0e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c0f0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
c100: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
c110: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c  TO_TLS1)) {..Tcl
c120: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c130: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70  terp, "TLS 1.0 p
c140: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
c150: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
c160: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
c170: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
c180: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
c190: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
c1a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c1b0: 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28  TLS1_1).    if (
c1c0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
c1d0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29  LS_PROTO_TLS1_1)
c1e0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
c1f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
c200: 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.1 protocol 
c210: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
c220: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c230: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
c240: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
c250: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
c260: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
c270: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
c280: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
c290: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
c2a0: 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c  _TLS1_2)) {..Tcl
c2b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c2c0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70  terp, "TLS 1.2 p
c2d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
c2e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
c2f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
c300: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
c310: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
c320: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
c330: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c340: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
c350: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
c360: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
c370: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
c380: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
c390: 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.3 protocol 
c3a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
c3b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c3c0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
c3d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
c3e0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b  f (proto == 0) {
c3f0: 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61  ../* Use full ra
c400: 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  nge */..SSL_CTX_
c410: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
c420: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09  rsion(ctx, 0);..
c430: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
c440: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
c450: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  x, 0);.    }..  
c460: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29    switch (proto)
c470: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
c480: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
c490: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
c4a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
c4b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c4c0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
c4d0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
c4e0: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL2:..method =
c4f0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
c500: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  2_server_method(
c510: 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74  ) : SSLv2_client
c520: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
c530: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
c540: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
c550: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c560: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20  SSL_NO_SSL3) && 
c570: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c580: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
c590: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
c5a0: 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f  OTO_SSL3:..metho
c5b0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53  d = isServer ? S
c5c0: 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68  SLv3_server_meth
c5d0: 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69  od() : SSLv3_cli
c5e0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
c5f0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
c600: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
c610: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
c620: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20  PENSSL_NO_TLS1) 
c630: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c640: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48  SSL_NO_TLS1_METH
c650: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
c660: 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65  _PROTO_TLS1:..me
c670: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
c680: 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d  ? TLSv1_server_m
c690: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
c6a0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
c6b0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
c6c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
c6d0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
c6e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
c6f0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
c700: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c710: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
c720: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
c730: 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_1:..method 
c740: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
c750: 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  v1_1_server_meth
c760: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63  od() : TLSv1_1_c
c770: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
c780: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
c790: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
c7a0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
c7b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c7c0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
c7d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
c7e0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
c7f0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
c800: 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_2:..method =
c810: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
c820: 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_2_server_metho
c830: 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c  d() : TLSv1_2_cl
c840: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
c850: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
c860: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
c870: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
c880: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
c890: 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c  1_3).    case TL
c8a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a  S_PROTO_TLS1_3:.
c8b0: 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65  ./* Use the gene
c8c0: 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63  ric method and c
c8d0: 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20  onstraint range 
c8e0: 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73  after context is
c8f0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74   created */..met
c900: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
c910: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68   TLS_server_meth
c920: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e  od() : TLS_clien
c930: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
c940: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
c950: 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f  efault:../* Nego
c960: 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76  tiate highest av
c970: 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20  ailable SSL/TLS 
c980: 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68  version */..meth
c990: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
c9a0: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
c9b0: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
c9c0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f  _method();.#if O
c9d0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
c9e0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
c9f0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
ca00: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
ca10: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
ca20: 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL2)..off |= (E
ca30: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
ca40: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20  S_PROTO_SSL2)   
ca50: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
ca60: 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv2);.#endif.#
ca70: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
ca80: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
ca90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
caa0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
cab0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
cac0: 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20  OTO_SSL3)   ? 0 
cad0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76  : SSL_OP_NO_SSLv
cae0: 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  3);.#endif.#if !
caf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
cb00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
cb10: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f  NSSL_NO_TLS1)..o
cb20: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
cb30: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
cb40: 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53  TLS1)   ? 0 : SS
cb50: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a  L_OP_NO_TLSv1);.
cb60: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
cb70: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
cb80: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
cb90: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f  SL_NO_TLS1_1)..o
cba0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
cbb0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
cbc0: 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53  TLS1_1) ? 0 : SS
cbd0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29  L_OP_NO_TLSv1_1)
cbe0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
cbf0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
cc00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
cc10: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
cc20: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
cc30: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cc40: 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20  O_TLS1_2) ? 0 : 
cc50: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
cc60: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  2);.#endif.#if !
cc70: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
cc80: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
cc90: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
cca0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
ccb0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
ccc0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20  OTO_TLS1_3) ? 0 
ccd0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
cce0: 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72  1_3);.#endif..br
ccf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
cd00: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
cd10: 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53  );..    ctx = SS
cd20: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64  L_CTX_new(method
cd30: 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29  );.    if (!ctx)
cd40: 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29   {..return(NULL)
cd50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
cd60: 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f  (getenv(SSLKEYLO
cd70: 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43  GFILE)) {..SSL_C
cd80: 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61  TX_set_keylog_ca
cd90: 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c  llback(ctx, KeyL
cda0: 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ogCallback);.   
cdb0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
cdc0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
cdd0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
cde0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
cdf0: 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f  f (proto == TLS_
ce00: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a  PROTO_TLS1_3) {.
ce10: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e  .SSL_CTX_set_min
ce20: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
ce30: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
ce40: 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  ON);..SSL_CTX_se
ce50: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73  t_max_proto_vers
ce60: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
ce70: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a  VERSION);.    }.
ce80: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46  #endif..    /* F
ce90: 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65  orce cipher sele
cea0: 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73  ction order by s
ceb0: 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20  erver */.    if 
cec0: 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53  (!isServer) {..S
ced0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
cee0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43  ns(ctx, SSL_OP_C
cef0: 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45  IPHER_SERVER_PRE
cf00: 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a  FERENCE);.    }.
cf10: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
cf20: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
cf30: 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70  10100000L.    Op
cf40: 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c  enSSL_add_all_al
cf50: 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c  gorithms(); /* L
cf60: 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20  oad ciphers and 
cf70: 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69  digests */.#endi
cf80: 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  f..    SSL_CTX_s
cf90: 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c  et_app_data(ctx,
cfa0: 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b   (void*)interp);
cfb0: 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65  ./* remember the
cfc0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
cfd0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
cfe0: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
cff0: 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c  _OP_ALL);./* all
d000: 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f   SSL bug workaro
d010: 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  unds */.    SSL_
d020: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
d030: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43  ctx, SSL_OP_NO_C
d040: 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20  OMPRESSION);./* 
d050: 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73  disable compress
d060: 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70  ion even if supp
d070: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c  orted */.    SSL
d080: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
d090: 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20  (ctx, off);../* 
d0a0: 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  disable protocol
d0b0: 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66   versions */.#if
d0c0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
d0d0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
d0e0: 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54  1000L.    SSL_CT
d0f0: 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20  X_set_mode(ctx, 
d100: 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45  SSL_MODE_AUTO_RE
d110: 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20  TRY);./* handle 
d120: 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69  new handshakes i
d130: 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e  n background. On
d140: 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f   by default in O
d150: 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f  penSSL 1.1.1. */
d160: 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f  .#endif.    SSL_
d170: 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63  CTX_sess_set_cac
d180: 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38  he_size(ctx, 128
d190: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  );..    /* Set u
d1a0: 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68  ser defined ciph
d1b0: 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74  ers, cipher suit
d1c0: 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79  es, and security
d1d0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
d1e0: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55   ((ciphers != NU
d1f0: 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f  LL) && !SSL_CTX_
d200: 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28  set_cipher_list(
d210: 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b  ctx, ciphers)) {
d220: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d230: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
d240: 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20  ciphers failed: 
d250: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
d260: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d270: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
d280: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
d290: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
d2a0: 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73  f ((ciphersuites
d2b0: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53   != NULL) && !SS
d2c0: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72  L_CTX_set_cipher
d2d0: 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68  suites(ctx, ciph
d2e0: 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63  ersuites)) {..Tc
d2f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d300: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68  nterp, "Set ciph
d310: 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64  er suites failed
d320: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
d330: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rs", (char *) NU
d340: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
d350: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
d360: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
d370: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74    /* Set securit
d380: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
d390: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26  f (level > -1 &&
d3a0: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f   level < 6) {../
d3b0: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69  * SSL_set_securi
d3c0: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c  ty_level */..SSL
d3d0: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74  _CTX_set_securit
d3e0: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76  y_level(ctx, lev
d3f0: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  el);.    }..    
d400: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c  /* set some call
d410: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c  backs */.    SSL
d420: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
d430: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20  _passwd_cb(ctx, 
d440: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
d450: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  );.    SSL_CTX_s
d460: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77  et_default_passw
d470: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74  d_cb_userdata(ct
d480: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
d490: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  Ptr);..    /* re
d4a0: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c  ad a Diffie-Hell
d4b0: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66  man parameters f
d4c0: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20  ile, or use the 
d4d0: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a  built-in one */.
d4e0: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  #ifdef OPENSSL_N
d4f0: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70  O_DH.    if (DHp
d500: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
d510: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d520: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70  lt(interp, "DH p
d530: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74  arameter support
d540: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c   not available",
d550: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d560: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
d570: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
d580: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  L;.    }.#else. 
d590: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69     {..DH* dh;..i
d5a0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
d5b0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20  ULL) {..    BIO 
d5c0: 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44  *bio;..    Tcl_D
d5d0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
d5e0: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f  ..    bio = BIO_
d5f0: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70  new_file(F2N(DHp
d600: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22  arams, &ds), "r"
d610: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f  );..    if (!bio
d620: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
d630: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63  gFree(&ds);...Tc
d640: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d650: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
d660: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65  t find DH parame
d670: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61  ters file", (cha
d680: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
d690: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
d6a0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
d6b0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20  .    }...    dh 
d6c0: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44  = PEM_read_bio_D
d6d0: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c  Hparams(bio, NUL
d6e0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
d6f0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69  .    BIO_free(bi
d700: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  o);..    Tcl_DSt
d710: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
d720: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09      if (!dh) {..
d730: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d740: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
d750: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72   not read DH par
d760: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c  ameters from fil
d770: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
d780: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
d790: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
d7a0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
d7b0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
d7c0: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b  tmp_dh(ctx, dh);
d7d0: 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68  ..    DH_free(dh
d7e0: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  );...} else {.. 
d7f0: 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b     /* Use well k
d800: 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65  nown DH paramete
d810: 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69  rs that have bui
d820: 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e  lt-in support in
d830: 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20   OpenSSL */..   
d840: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65   if (!SSL_CTX_se
d850: 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31  t_dh_auto(ctx, 1
d860: 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  )) {...Tcl_Appen
d870: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d880: 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c  "Could not enabl
d890: 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22  e set DH auto: "
d8a0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
d8b0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
d8c0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
d8d0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
d8e0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
d8f0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
d900: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63      /* set our c
d910: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20  ertificate */.  
d920: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b    load_private_k
d930: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28  ey = 0;.    if (
d940: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  certfile != NULL
d950: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
d960: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c  e_key = 1;...Tcl
d970: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
d980: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
d990: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
d9a0: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63  _file(ctx, F2N(c
d9b0: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  ertfile, &ds), S
d9c0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
d9d0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
d9e0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
d9f0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
da00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
da10: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
da20: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
da30: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
da40: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52  : ",...GET_ERR_R
da50: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
da60: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
da70: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
da80: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
da90: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
daa0: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
dab0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
dac0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
dad0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
dae0: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
daf0: 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72  x, cert_len, cer
db00: 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20  t) <= 0) {..    
db10: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
db20: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
db30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
db40: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
db50: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20  et certificate: 
db60: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
db70: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
db80: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
db90: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
dba0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
dbb0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
dbc0: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68  ..certfile = (ch
dbd0: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66  ar*)X509_get_def
dbe0: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29  ault_cert_file()
dbf0: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
dc00: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
dc10: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69  file(ctx, certfi
dc20: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  le, SSL_FILETYPE
dc30: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69  _PEM) <= 0) {.#i
dc40: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  f 0..    Tcl_DSt
dc50: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
dc60: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
dc70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
dc80: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61  able to use defa
dc90: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ult certificate 
dca0: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
dcb0: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52  , ": ",...GET_ER
dcc0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
dcd0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
dce0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
dcf0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
dd00: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  NULL;.#endif..}.
dd10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
dd20: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
dd30: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
dd40: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
dd50: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
dd60: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
dd70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
dd80: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
dd90: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
dda0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
ddb0: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
ddc0: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
ddd0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
dde0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
ddf0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
de00: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
de10: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
de20: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
de30: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
de40: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
de50: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64   F2N(keyfile, &d
de60: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
de70: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
de80: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
de90: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
dea0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
deb0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
dec0: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
ded0: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
dee0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
def0: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
df00: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
df10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
df20: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
df30: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79   key file ", key
df40: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20  file, " ",...   
df50: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
df60: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
df70: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
df80: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
df90: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
dfa0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
dfb0: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73  ee(&ds);...} els
dfc0: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
dfd0: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
dfe0: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
dff0: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
e000: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
e010: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20  ,key_len) <= 0) 
e020: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
e030: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
e040: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
e050: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
e060: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
e070: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
e080: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
e090: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
e0a0: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
e0b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e0c0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
e0d0: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54  blic key: ", GET
e0e0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
e0f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e100: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
e110: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
e120: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a  L;..    }..}../*
e130: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61   Now we know tha
e140: 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74  t a key and cert
e150: 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
e160: 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53  gainst.. * the S
e170: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69  SL context */..i
e180: 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63  f (!SSL_CTX_chec
e190: 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74  k_private_key(ct
e1a0: 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  x)) {..    Tcl_A
e1b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e1c0: 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79  rp, "private key
e1d0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
e1e0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
e1f0: 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09  public key",....
e200: 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55       (char *) NU
e210: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
e220: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
e230: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
e240: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
e250: 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e  Set verification
e260: 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   CAs */.    Tcl_
e270: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
e280: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
e290: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20  gInit(&ds1);.   
e2a0: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65   /* There is one
e2b0: 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
e2c0: 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20  ry, one default 
e2d0: 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65  file, and one de
e2e0: 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68  fault store...Th
e2f0: 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 72  e default CA cer
e300: 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63 74  tificates direct
e310: 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74  ory (and default
e320: 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68   store) is in th
e330: 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73  e OpenSSL..certs
e340: 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63   directory. It c
e350: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
e360: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
e370: 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68  _DIR env var. Th
e380: 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 65  e..default CA ce
e390: 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 20  rtificates file 
e3a0: 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70  is called cert.p
e3b0: 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c  em in the defaul
e3c0: 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63  t OpenSSL..direc
e3d0: 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20  tory. It can be 
e3e0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
e3f0: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20  e SSL_CERT_FILE 
e400: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20  env var. */../* 
e410: 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  int SSL_CTX_set_
e420: 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64  default_verify_d
e430: 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29  ir(SSL_CTX *ctx)
e440: 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58   and int SSL_CTX
e450: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
e460: 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58  ify_file(SSL_CTX
e470: 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66   *ctx) */.    if
e480: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f   (!SSL_CTX_load_
e490: 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73  verify_locations
e4a0: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65  (ctx, F2N(CAfile
e4b0: 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69  , &ds), F2N(CAdi
e4c0: 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53  r, &ds1)) ||..!S
e4d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
e4e0: 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28  lt_verify_paths(
e4f0: 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54  ctx)) {.#if 0..T
e500: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e510: 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  ds);..Tcl_DStrin
e520: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a  gFree(&ds1);../*
e530: 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79   Don't currently
e540: 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61   care if this fa
e550: 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65  ils */..Tcl_Appe
e560: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e570: 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65   "SSL default ve
e580: 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 47  rify paths: ", G
e590: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
e5a0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e5b0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e5c0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e5d0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  L;.#endif.    }.
e5e0: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f  .    /* https://
e5f0: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
e600: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a  p/tls/bugs/57/ *
e610: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44  /.    /* XXX:TOD
e620: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20  O: Let the user 
e630: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65  supply values he
e640: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f  re instead of so
e650: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69  mething that exi
e660: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sts on the files
e670: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20  ystem */.    if 
e680: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  (CAfile != NULL)
e690: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30   {..STACK_OF(X50
e6a0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
e6b0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
e6c0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
e6d0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
e6e0: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21  .if (certNames !
e6f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53  = NULL) {..    S
e700: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
e710: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63  t_CA_list(ctx, c
e720: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20  ertNames);..}.  
e730: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
e740: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20  ringFree(&ds);. 
e750: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
e760: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65  ee(&ds1);.    re
e770: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a  turn ctx;.}.../*
e780: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
e790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61  ------. *. * Sta
e7d0: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  tusObjCmd -- ret
e7e0: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20  urn certificate 
e7f0: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65  for connected pe
e800: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
e810: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
e820: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
e830: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
e840: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
e850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e890: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
e8a0: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43  t.StatusObjCmd(C
e8b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
e8c0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
e8d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
e8e0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
e8f0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
e900: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
e910: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72  ;.    X509 *peer
e920: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  ;.    Tcl_Obj *o
e930: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43  bjPtr;.    Tcl_C
e940: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
e950: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61   char *channelNa
e960: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20  me, *ciphers;.  
e970: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20    int mode;.    
e980: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
e990: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20  har *proto;.    
e9a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
e9b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72  ;.    int nid, r
e9c0: 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  es;.    (void) c
e9d0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
e9e0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
e9f0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
ea00: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33   < 2 || objc > 3
ea10: 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26   || (objc == 3 &
ea20: 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65  & !strcmp(Tcl_Ge
ea30: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
ea40: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a  , "-local"))) {.
ea50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
ea60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ea70: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61  v, "?-local? cha
ea80: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
ea90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
eaa0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61  ..    /* Get cha
eab0: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63  nnel Id */.    c
eac0: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c  hannelName = Tcl
ead0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
eae0: 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20  j(objv[(objc == 
eaf0: 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 63  2 ? 1 : 2)], (Tc
eb00: 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b  l_Size *) NULL);
eb10: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
eb20: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
eb30: 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  p, channelName, 
eb40: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28  &mode);.    if (
eb50: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
eb60: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
eb70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eb80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
eb90: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
eba0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
ebb0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
ebc0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
ebd0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
ebe0: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
ebf0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
ec00: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
ec10: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
ec20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ec30: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
ec40: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
ec50: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
ec60: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
ec70: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
ec80: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
ec90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
eca0: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43  S", "STATUS", "C
ecb0: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
ecc0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
ecd0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
ece0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ecf0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
ed00: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  te *) Tcl_GetCha
ed10: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
ed20: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  (chan);..    /* 
ed30: 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  Get certificate 
ed40: 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66  for peer or self
ed50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
ed60: 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d   == 2) {..peer =
ed70: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65   SSL_get_peer_ce
ed80: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
ed90: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20  tr->ssl);.    } 
eda0: 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53  else {..peer = S
edb0: 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61  SL_get_certifica
edc0: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
edd0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
ede0: 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66   Get X509 certif
edf0: 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  icate info */.  
ee00: 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
ee10: 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
ee20: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
ee30: 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
ee40: 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30  == 2) {..    X50
ee50: 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20  9_free(peer);.. 
ee60: 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a     peer = NULL;.
ee70: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
ee80: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
ee90: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
eea0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
eeb0: 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
eec0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
eed0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
eee0: 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  eername", SSL_ge
eef0: 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
ef00: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
ef10: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
ef20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
ef30: 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65   "sbits", SSL_ge
ef40: 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74  t_cipher_bits(st
ef50: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c  atePtr->ssl, NUL
ef60: 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  L));..    cipher
ef70: 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
ef80: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
ef90: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41  tr->ssl);.    LA
efa0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
efb0: 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
efc0: 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29  r", ciphers, -1)
efd0: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
efe0: 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
eff0: 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
f000: 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
f010: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
f020: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
f030: 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09  verifyResult",..
f040: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
f050: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
f060: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
f070: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
f080: 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  l)), -1);..    /
f090: 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f  * Verify mode */
f0a0: 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  .    mode = SSL_
f0b0: 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28  get_verify_mode(
f0c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
f0d0: 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20      if (mode && 
f0e0: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
f0f0: 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
f100: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f110: 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
f120: 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
f130: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
f140: 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
f150: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
f160: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
f170: 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
f180: 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
f190: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f1a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
f1b0: 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
f1c0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
f1d0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
f1e0: 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
f1f0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
f200: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
f210: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f220: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f230: 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
f240: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f250: 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
f260: 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
f270: 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
f280: 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
f290: 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
f2a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f2b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
f2c0: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
f2d0: 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
f2e0: 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
f2f0: 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
f300: 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
f310: 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
f320: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f330: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
f340: 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
f350: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f360: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
f370: 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
f380: 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
f390: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
f3a0: 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
f3b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
f3c0: 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
f3d0: 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
f3e0: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
f3f0: 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
f400: 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
f410: 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
f420: 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
f430: 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
f440: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
f450: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
f460: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
f470: 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
f480: 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
f490: 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
f4a0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
f4b0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
f4c0: 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
f4d0: 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
f4e0: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
f4f0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
f500: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f510: 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
f520: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
f530: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
f540: 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
f550: 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
f560: 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
f570: 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
f580: 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
f590: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
f5a0: 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
f5b0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
f5c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
f5d0: 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
f5e0: 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
f5f0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
f600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
f610: 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
f620: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
f630: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f640: 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
f650: 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
f660: 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
f670: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ..    if (objc =
f680: 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
f690: 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
f6a0: 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
f6b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
f6c0: 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
f6d0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
f6e0: 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
f6f0: 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
f700: 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
f710: 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
f720: 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
f730: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
f740: 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
f750: 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
f760: 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a  2ln(nid), -1);..
f770: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
f780: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
f790: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
f7a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
f7b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
f7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
f800: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
f810: 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
f820: 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
f830: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
f840: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
f850: 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
f860: 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
f870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
f8b0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
f8c0: 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
f8d0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
f8e0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
f8f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
f900: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
f910: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
f920: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
f930: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
f940: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
f950: 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20   mode on */.    
f960: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
f970: 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
f980: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
f990: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
f9a0: 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
f9b0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
f9c0: 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
f9d0: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
f9e0: 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
f9f0: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
fa00: 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ion;.    const E
fa10: 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28  VP_MD *md;.    (
fa20: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
fa30: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
fa40: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
fa50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
fa60: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
fa70: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
fa80: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
fa90: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
faa0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
fab0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
fac0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
fad0: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e  , (Tcl_Size *) N
fae0: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ULL), NULL);.   
faf0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
fb00: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
fb10: 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45   {..return(TCL_E
fb20: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
fb30: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
fb40: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
fb50: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
fb60: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
fb70: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
fb80: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
fb90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
fba0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
fbb0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
fbc0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
fbd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
fbe0: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
fbf0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
fc00: 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a  chan),..    "\":
fc10: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
fc20: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  el", NULL);..Tcl
fc30: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
fc40: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f  terp, "TLS", "CO
fc50: 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e  NNECTION", "CHAN
fc60: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
fc70: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
fc80: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
fc90: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OR);.    }..    
fca0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
fcb0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
fcc0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;..    /* Connec
fcd0: 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  tion info */.   
fce0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
fcf0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
fd00: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
fd10: 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d  chan);.    ssl =
fd20: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a   statePtr->ssl;.
fd30: 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e      if (ssl != N
fd40: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65  ULL) {../* conne
fd50: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09  ction state */..
fd60: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
fd70: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
fd80: 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73  te", SSL_state_s
fd90: 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c  tring_long(ssl),
fda0: 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53   -1);.../* Get S
fdb0: 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72  NI requested ser
fdc0: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50  ver name */..LAP
fdd0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
fde0: 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72   objPtr, "server
fdf0: 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73  name", SSL_get_s
fe00: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54  ervername(ssl, T
fe10: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68  LSEXT_NAMETYPE_h
fe20: 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a  ost_name), -1);.
fe30: 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f  ../* Get protoco
fe40: 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l */..LAPPEND_ST
fe50: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
fe60: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53  , "protocol", SS
fe70: 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73  L_get_version(ss
fe80: 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65  l), -1);.../* Re
fe90: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f  negotiation allo
fea0: 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  wed */..LAPPEND_
feb0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
fec0: 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74  Ptr, "renegotiat
fed0: 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53  ion_allowed", SS
fee0: 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e  L_get_secure_ren
fef0: 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f  egotiation_suppo
ff00: 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29  rt((SSL *) ssl))
ff10: 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72  ;.../* Get secur
ff20: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41  ity level */..LA
ff30: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
ff40: 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72  , objPtr, "secur
ff50: 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f  ity_level", SSL_
ff60: 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  get_security_lev
ff70: 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53  el(ssl));.../* S
ff80: 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09  ession info */..
ff90: 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
ffa0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
ffb0: 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53  ssion_reused", S
ffc0: 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65  SL_session_reuse
ffd0: 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  d(ssl));.../* Is
ffe0: 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   server info */.
fff0: 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
10000 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69  terp, objPtr, "i
10010 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69  s_server", SSL_i
10020 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a  s_server(ssl));.
10030 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a  ../* Is DTLS */.
10040 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
10050 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69  terp, objPtr, "i
10060 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f  s_dtls", SSL_is_
10070 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20  dtls(ssl));.    
10080 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72  }..    /* Cipher
10090 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70   info */.    cip
100a0 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  her = SSL_get_cu
100b0 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c  rrent_cipher(ssl
100c0 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  );.    if (ciphe
100d0 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  r != NULL) {..ch
100e0 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d  ar buf[BUFSIZ] =
100f0 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c   {0};..int bits,
10100 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20   alg_bits;.../* 
10110 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  Cipher name */..
10120 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10130 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
10140 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  her", SSL_CIPHER
10150 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72  _get_name(cipher
10160 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43  ), -1);.../* RFC
10170 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
10180 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
10190 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
101a0 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c  "standard_name",
101b0 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e   SSL_CIPHER_stan
101c0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
101d0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65  ), -1);.../* Ope
101e0 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70  nSSL name of cip
101f0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
10200 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10210 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d  tr, "openssl_nam
10220 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68  e", OPENSSL_ciph
10230 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48  er_name(SSL_CIPH
10240 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
10250 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
10260 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73  ../* number of s
10270 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20  ecret bits used 
10280 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62  for cipher */..b
10290 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  its = SSL_CIPHER
102a0 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72  _get_bits(cipher
102b0 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c  , &alg_bits);..L
102c0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
102d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72  p, objPtr, "secr
102e0 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b  et_bits", bits);
102f0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
10300 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
10310 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20  lgorithm_bits", 
10320 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61  alg_bits);../* a
10330 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61  lg_bits is actua
10340 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74  l key secret bit
10350 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61  s. If use bits a
10360 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72  nd secret (algor
10370 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65  ithm) bits diffe
10380 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20  r,..   the rest 
10390 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20  of the bits are 
103a0 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20  fixed, i.e. for 
103b0 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63  limited export c
103c0 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35  iphers (bits < 5
103d0 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63  6) */.../* Indic
103e0 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54  ates which SSL/T
103f0 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  LS protocol vers
10400 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65  ion first define
10410 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a  d the cipher */.
10420 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10430 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69  erp, objPtr, "mi
10440 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f  n_version", SSL_
10450 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69  CIPHER_get_versi
10460 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  on(cipher), -1);
10470 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44  .../* Cipher NID
10480 2c 20 64 69 67 65 73 74 20 4e 49 44 20 28 6e 6f  , digest NID (no
10490 6e 65 20 66 6f 72 20 41 45 41 44 20 63 69 70 68  ne for AEAD ciph
104a0 65 72 20 73 75 69 74 65 73 29 2c 20 4b 65 79 20  er suites), Key 
104b0 45 78 63 68 61 6e 67 65 20 4e 49 44 2c 20 61 6e  Exchange NID, an
104c0 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  d authentication
104d0 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44   NID */..LAPPEND
104e0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
104f0 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22  Ptr, "cipherNID"
10500 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
10510 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
10520 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63  get_cipher_nid(c
10530 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
10540 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10550 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65  p, objPtr, "dige
10560 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  stNID", (char *)
10570 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
10580 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74  IPHER_get_digest
10590 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
105a0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
105b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
105c0 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44   "keyExchangeNID
105d0 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
105e0 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
105f0 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68  _get_kx_nid(ciph
10600 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  er)), -1);..LAPP
10610 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10620 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74  objPtr, "authent
10630 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68  icationNID", (ch
10640 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
10650 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61  SSL_CIPHER_get_a
10660 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29  uth_nid(cipher))
10670 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73  , -1);.../* mess
10680 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  age authenticati
10690 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72  on code - Cipher
106a0 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47   is AEAD (e.g. G
106b0 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50  CM or ChaCha20/P
106c0 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20  oly1305) or not 
106d0 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63  */../* Authentic
106e0 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20  ated Encryption 
106f0 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  with associated 
10700 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63  data (AEAD) chec
10710 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  k */..LAPPEND_BO
10720 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
10730 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65  r, "cipher_is_ae
10740 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  ad", SSL_CIPHER_
10750 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29  is_aead(cipher))
10760 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53  ;.../* Get OpenS
10770 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20  SL-specific ID, 
10780 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09  not IANA ID */..
10790 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
107a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
107b0 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53  her_id", (int) S
107c0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64  SL_CIPHER_get_id
107d0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
107e0 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64  Two-byte ID used
107f0 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74   in the TLS prot
10800 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65  ocol of the give
10810 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  n cipher */..LAP
10820 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
10830 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
10840 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53  ol_id", (int) SS
10850 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f  L_CIPHER_get_pro
10860 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29  tocol_id(cipher)
10870 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20  );.../* Textual 
10880 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
10890 68 65 20 63 69 70 68 65 72 2e 20 49 6e 63 6c 75  he cipher. Inclu
108a0 64 65 73 3a 20 63 69 70 68 65 72 20 6e 61 6d 65  des: cipher name
108b0 2c 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69  , protocol versi
108c0 6f 6e 2c 20 6b 65 79 0a 09 20 20 20 65 78 63 68  on, key..   exch
108d0 61 6e 67 65 2c 20 61 75 74 68 65 6e 74 69 63 61  ange, authentica
108e0 74 69 6f 6e 2c 20 73 79 6d 6d 65 74 72 69 63 20  tion, symmetric 
108f0 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65 74 68 6f  encryption metho
10900 64 2c 20 6d 65 73 73 61 67 65 20 61 75 74 68 65  d, message authe
10910 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2a  ntication code *
10920 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  /..if (SSL_CIPHE
10930 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69  R_description(ci
10940 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f  pher, buf, sizeo
10950 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
10960 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f   {..    LAPPEND_
10970 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10980 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e  tr, "description
10990 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a  ", buf, -1);..}.
109a0 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64  ../* Digest used
109b0 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f   during the SSL/
109c0 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68  TLS handshake wh
109d0 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70  en using the cip
109e0 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53  her. */..md = SS
109f0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e  L_CIPHER_get_han
10a00 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69  dshake_digest(ci
10a10 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  pher);..LAPPEND_
10a20 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10a30 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64  tr, "handshake_d
10a40 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29  igest", (char *)
10a50 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c  EVP_MD_name(md),
10a60 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
10a70 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
10a80 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
10a90 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
10aa0 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
10ab0 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
10ac0 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
10ad0 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
10ae0 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
10af0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
10b00 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
10b10 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
10b20 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e  _id, *proto;..un
10b30 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66  signed char buff
10b40 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  er[SSL_MAX_MASTE
10b50 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a  R_KEY_LENGTH];..
10b60 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
10b70 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
10b80 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
10b90 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61  the ALPN negotia
10ba0 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  tion */..SSL_SES
10bb0 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  SION_get0_alpn_s
10bc0 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c  elected(session,
10bd0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b   &proto, &len2);
10be0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10bf0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
10c00 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70  lpn", (char *) p
10c10 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
10c20 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70   len2);.../* Rep
10c30 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
10c40 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
10c50 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e  esult of the NPN
10c60 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
10c70 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
10c80 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72  SSL_get0_next_pr
10c90 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73  oto_negotiated(s
10ca0 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65  sl, &proto, &ule
10cb0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
10cc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10cd0 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29   "npn", (char *)
10ce0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
10cf0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66  e) ulen);.#endif
10d00 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20  .../* Resumable 
10d10 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50  session */..LAPP
10d20 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
10d30 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61   objPtr, "resuma
10d40 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ble", SSL_SESSIO
10d50 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73  N_is_resumable(s
10d60 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
10d70 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
10d80 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
10d90 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50   epoch) */..LAPP
10da0 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
10db0 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f   objPtr, "start_
10dc0 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
10dd0 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73  ON_get_time(sess
10de0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  ion));.../* Time
10df0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
10e00 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
10e10 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
10e20 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
10e30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
10e40 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53  imeout", SSL_SES
10e50 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74  SION_get_timeout
10e60 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
10e70 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c   Session id - TL
10e80 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20  Sv1.2 and below 
10e90 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  only */..session
10ea0 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
10eb0 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
10ec0 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
10ed0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
10ee0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
10ef0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f  on_id", session_
10f00 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
10f10 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  len);.../* Sessi
10f20 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  on context */..s
10f30 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
10f40 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f  SESSION_get0_id_
10f50 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c  context(session,
10f60 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
10f70 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
10f80 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
10f90 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73  n_context", sess
10fa0 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
10fb0 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
10fc0 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20  ession ticket - 
10fd0 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09  client only */..
10fe0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
10ff0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c  _ticket(session,
11000 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
11010 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
11020 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
11030 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65  , "session_ticke
11040 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  t", ticket, (Tcl
11050 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
11060 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
11070 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20  t lifetime hint 
11080 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
11090 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
110a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c  terp, objPtr, "l
110b0 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  ifetime", SSL_SE
110c0 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74  SSION_get_ticket
110d0 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73  _lifetime_hint(s
110e0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
110f0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a  icket app data *
11100 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
11110 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
11120 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f  x30000000L..SSL_
11130 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
11140 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c  ket_appdata((SSL
11150 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73  _SESSION *) sess
11160 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
11170 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
11180 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
11190 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70  jPtr, "ticket_ap
111a0 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c  p_data", ticket,
111b0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
111c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47  );.#endif.../* G
111d0 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f  et master key */
111e0 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53  ..len2 = SSL_SES
111f0 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f  SION_get_master_
11200 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66  key(session, buf
11210 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53  fer, SSL_MAX_MAS
11220 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b  TER_KEY_LENGTH);
11230 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
11240 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11250 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62   "master_key", b
11260 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65  uffer, (Tcl_Size
11270 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f  ) len2);.../* Co
11280 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  mpression id */.
11290 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64  .unsigned int id
112a0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
112b0 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73  et_compress_id(s
112c0 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e  ession);..LAPPEN
112d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
112e0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
112f0 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20  on_id", id == 1 
11300 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65  ? "zlib" : "none
11310 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ", -1);.    }.. 
11320 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
11330 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
11340 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
11350 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
11360 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
11370 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
11380 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
11390 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
113a0 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
113b0 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
113c0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
113d0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
113e0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
113f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11400 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d  ompression", com
11410 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  p ? SSL_COMP_get
11420 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e  _name(comp) : "n
11430 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
11440 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11450 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
11460 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f  on", expn ? SSL_
11470 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78  COMP_get_name(ex
11480 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  pn) : "none", -1
11490 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e  );.#else..LAPPEN
114a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
114b0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
114c0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
114d0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
114e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
114f0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e  expansion", "non
11500 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  e", -1);.#endif.
11510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
11520 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
11530 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20   {..long mode = 
11540 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73  SSL_CTX_get_sess
11550 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
11560 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
11570 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20  char *msg;...if 
11580 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
11590 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20  _CACHE_OFF) {.. 
115a0 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a     msg = "off";.
115b0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
115c0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
115d0 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20  E_CLIENT) {..   
115e0 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b   msg = "client";
115f0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
11600 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
11610 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20  HE_SERVER) {..  
11620 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22    msg = "server"
11630 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
11640 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
11650 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20  CHE_BOTH) {..   
11660 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09   msg = "both";..
11670 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73  } else {..    ms
11680 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09  g = "unknown";..
11690 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  }..LAPPEND_STR(i
116a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
116b0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
116c0 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  de", msg, -1);. 
116d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20     }..    /* CA 
116e0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  List */.    /* I
116f0 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20  F not a server, 
11700 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30  same as SSL_get0
11710 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49  _peer_CA_list. I
11720 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73  f server same as
11730 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69   SSL_CTX_get_cli
11740 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20  ent_CA_list */. 
11750 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c     listPtr = Tcl
11760 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
11770 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f  ULL);.    STACK_
11780 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
11790 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28  a_list;.    if (
117a0 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67  (ca_list = SSL_g
117b0 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
117c0 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29  t(ssl)) != NULL)
117d0 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b   {..char buffer[
117e0 42 55 46 53 49 5a 5d 3b 0a 0a 09 66 6f 72 20 28  BUFSIZ];...for (
117f0 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
11800 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28  k_X509_NAME_num(
11810 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b  ca_list); i++) {
11820 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
11830 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f  *name = sk_X509_
11840 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69  NAME_value(ca_li
11850 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20  st, i);..    if 
11860 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f  (name) {...X509_
11870 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d  NAME_oneline(nam
11880 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49  e, buffer, BUFSI
11890 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62  Z);...Tcl_ListOb
118a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
118b0 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20  nterp, listPtr, 
118c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
118d0 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09  (buffer, -1));..
118e0 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20      }..}.    }. 
118f0 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69     LAPPEND_OBJ(i
11900 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11910 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72  caList", listPtr
11920 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  );.    LAPPEND_I
11930 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
11940 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22  r, "caListCount"
11950 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e  , sk_X509_NAME_n
11960 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 0a  um(ca_list));...
11970 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
11980 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
11990 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
119a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
119b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
119c0 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 4d 69 73 63  -----. *. * Misc
11a00 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63  ObjCmd -- misc c
11a10 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65  ommands. *. * Re
11a20 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
11a30 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
11a40 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
11a50 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
11a60 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11aa0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
11ab0 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64  c int.MiscObjCmd
11ac0 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
11ad0 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
11ae0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
11af0 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
11b00 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
11b10 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
11b20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b  char *commands [
11b30 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74  ] = { "req", "st
11b40 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20  rreq", NULL };. 
11b50 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20     enum command 
11b60 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45  { C_REQ, C_STRRE
11b70 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20  Q, C_DUMMY };.  
11b80 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a    Tcl_Size cmd;.
11b90 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20      int isStr;. 
11ba0 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31     char buffer[1
11bb0 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64  6384];.    (void
11bc0 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
11bd0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
11be0 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
11bf0 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f  bjc < 2) {..Tcl_
11c00 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11c10 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73  erp, 1, objv, "s
11c20 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f  ubcommand ?args?
11c30 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
11c40 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11c50 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
11c60 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
11c70 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e   objv[1], comman
11c80 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30  ds, "command", 0
11c90 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f  , &cmd) != TCL_O
11ca0 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
11cb0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11cc0 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
11cd0 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72  or();..    isStr
11ce0 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52   = (cmd == C_STR
11cf0 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68  REQ);.    switch
11d00 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29   ((enum command)
11d10 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f   cmd) {..case C_
11d20 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52  REQ:..case C_STR
11d30 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f  REQ: {..    EVP_
11d40 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b  PKEY *pkey=NULL;
11d50 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74  ..    X509 *cert
11d60 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
11d70 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c  _NAME *name=NULL
11d80 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  ;..    Tcl_Obj *
11d90 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c  *listv;..    Tcl
11da0 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20  _Size listc;..  
11db0 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42    int i;...    B
11dc0 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09  IO *out=NULL;...
11dd0 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22      char *k_C=""
11de0 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22  ,*k_ST="",*k_L="
11df0 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d  ",*k_O="",*k_OU=
11e00 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45  "",*k_CN="",*k_E
11e10 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68  mail="";..    ch
11e20 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f  ar *keyout,*pemo
11e30 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e  ut,*str;..    in
11e40 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c  t keysize,serial
11e50 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69  =0,days=365;..#i
11e60 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
11e70 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
11e80 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e  00000L..    BIGN
11e90 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a  UM *bne = NULL;.
11ea0 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20  .    RSA *rsa = 
11eb0 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20  NULL;.#else..   
11ec0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63   EVP_PKEY_CTX *c
11ed0 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  tx = NULL;.#endi
11ee0 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a  f...    if ((obj
11ef0 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29  c<5) || (objc>6)
11f00 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e  ) {...Tcl_WrongN
11f10 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
11f20 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65  , objv, "keysize
11f30 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c   keyfile certfil
11f40 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65  e ?info?");...re
11f50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11f60 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
11f70 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
11f80 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11f90 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d  2], &keysize) !=
11fa0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74   TCL_OK) {...ret
11fb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
11fc0 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75      }..    keyou
11fd0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
11fe0 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70  objv[3]);..    p
11ff0 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  emout=Tcl_GetStr
12000 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20  ing(objv[4]);.. 
12010 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a     if (isStr) {.
12020 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
12030 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29  erp,keyout,"",0)
12040 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69  ;...Tcl_SetVar(i
12050 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c  nterp,pemout,"",
12060 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  0);..    }...   
12070 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a   if (objc>=6) {.
12080 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62  ..if (Tcl_ListOb
12090 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
120a0 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c  erp, objv[5], &l
120b0 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d  istc, &listv) !=
120c0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20   TCL_OK) {...   
120d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
120e0 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c  R;...}....if ((l
120f0 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a  istc%2) != 0) {.
12100 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
12110 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f  ult(interp,"Info
12120 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73  rmation list mus
12130 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62  t have even numb
12140 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22  er of arguments"
12150 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
12160 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12170 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20  ..}...for (i=0; 
12180 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b  i<listc; i+=2) {
12190 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47  ...    str=Tcl_G
121a0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
121b0 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74  ]);...    if (st
121c0 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29  rcmp(str,"days")
121d0 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
121e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
121f0 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
12200 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b  ],&days)!=TCL_OK
12210 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
12220 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
12230 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
12240 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29  mp(str,"serial")
12250 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
12260 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
12270 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
12280 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f  ],&serial)!=TCL_
12290 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
122a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
122b0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
122c0 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30  rcmp(str,"C")==0
122d0 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47  ) {....k_C=Tcl_G
122e0 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
122f0 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
12300 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
12310 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"ST")==0) {...
12320 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72  .k_ST=Tcl_GetStr
12330 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
12340 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
12350 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22   (strcmp(str,"L"
12360 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54  )==0) {....k_L=T
12370 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12380 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
12390 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
123a0 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b  p(str,"O")==0) {
123b0 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53  ....k_O=Tcl_GetS
123c0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
123d0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
123e0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
123f0 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  OU")==0) {....k_
12400 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  OU=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 69 66 20 28 73      } else if (s
12430 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d  trcmp(str,"CN")=
12440 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63  =0) {....k_CN=Tc
12450 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
12460 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
12470 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
12480 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30  (str,"Email")==0
12490 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54  ) {....k_Email=T
124a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
124b0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
124c0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f  } else {....Tcl_
124d0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
124e0 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65  ,"Unknown parame
124f0 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72  ter",NULL);....r
12500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12510 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
12520 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
12530 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
12540 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20  < 0x30000000L.. 
12550 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28     bne = BN_new(
12560 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53  );..    rsa = RS
12570 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b  A_new();..    pk
12580 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65  ey = EVP_PKEY_ne
12590 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e  w();..    if (bn
125a0 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61  e == NULL || rsa
125b0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79   == NULL || pkey
125c0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f   == NULL || !BN_
125d0 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41  set_word(bne,RSA
125e0 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67  _F4) ||...!RSA_g
125f0 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72  enerate_key_ex(r
12600 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65  sa, keysize, bne
12610 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f  , NULL) || !EVP_
12620 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28  PKEY_assign_RSA(
12630 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09  pkey, rsa)) {...
12640 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
12650 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72  ey);.../* RSA_fr
12660 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62  ee(rsa); freed b
12670 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20  y EVP_PKEY_free 
12680 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65  */...BN_free(bne
12690 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b  );.#else..    pk
126a0 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e  ey = EVP_RSA_gen
126b0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
126c0 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63  keysize);..    c
126d0 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54  tx = EVP_PKEY_CT
126e0 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29  X_new(pkey,NULL)
126f0 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20  ;..    if (pkey 
12700 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d  == NULL || ctx =
12710 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50  = NULL || !EVP_P
12720 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28  KEY_keygen_init(
12730 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50  ctx) ||...!EVP_P
12740 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f  KEY_CTX_set_rsa_
12750 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c  keygen_bits(ctx,
12760 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56   keysize) || !EV
12770 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74  P_PKEY_keygen(ct
12780 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45  x, &pkey)) {...E
12790 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
127a0 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43  y);...EVP_PKEY_C
127b0 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65  TX_free(ctx);.#e
127c0 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65  ndif...Tcl_SetRe
127d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
127e0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72  or generating pr
127f0 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29  ivate key",NULL)
12800 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
12810 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73  RROR;..    } els
12820 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29  e {...if (isStr)
12830 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
12840 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
12850 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
12860 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
12870 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
12880 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
12890 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72  );...    i=BIO_r
128a0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73  ead(out,buffer,s
128b0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29  izeof(buffer)-1)
128c0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20  ;...    i=(i<0) 
128d0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62  ? 0 : i;...    b
128e0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09  uffer[i]='\0';..
128f0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
12900 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75  interp,keyout,bu
12910 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42  ffer,0);...    B
12920 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09  IO_flush(out);..
12930 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75  .    BIO_free(ou
12940 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t);...} else {..
12950 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
12960 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a  (BIO_s_file());.
12970 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f  ..    BIO_write_
12980 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79  filename(out,key
12990 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  out);...    PEM_
129a0 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74  write_bio_Privat
129b0 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55  eKey(out,pkey,NU
129c0 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e  LL,NULL,0,NULL,N
129d0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50  ULL);...    /* P
129e0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41  EM_write_bio_RSA
129f0 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20  PrivateKey(out, 
12a00 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  rsa, NULL, NULL,
12a10 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b   0, NULL, NULL);
12a20 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72   */...    BIO_fr
12a30 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09  ee_all(out);.. .
12a40 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58  }....if ((cert=X
12a50 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c  509_new())==NULL
12a60 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
12a70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
12a80 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  Error generating
12a90 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71   certificate req
12aa0 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  uest",NULL);... 
12ab0 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
12ac0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
12ad0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
12ae0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
12af0 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
12b00 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
12b10 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52    return(TCL_ERR
12b20 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  OR);...}....X509
12b30 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
12b40 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
12b50 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
12b60 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
12b70 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
12b80 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
12b90 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
12ba0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
12bb0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
12bc0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
12bd0 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
12be0 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
12bf0 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
12c00 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
12c10 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
12c20 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
12c30 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
12c40 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
12c50 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
12c60 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
12c70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
12c80 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
12c90 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12ca0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12cb0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
12cc0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
12cd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
12ce0 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
12cf0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12d00 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
12d10 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
12d20 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
12d30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
12d40 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
12d50 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
12d60 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
12d70 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
12d80 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
12d90 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
12da0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
12db0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12dc0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12dd0 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
12de0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
12df0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
12e00 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
12e10 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12e20 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12e30 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
12e40 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
12e50 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
12e60 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
12e70 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
12e80 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
12e90 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
12ea0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
12eb0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
12ec0 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
12ed0 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
12ee0 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
12ef0 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
12f00 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
12f10 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
12f20 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
12f30 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
12f40 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
12f50 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
12f60 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12f70 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
12f80 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
12f90 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
12fa0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
12fb0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
12fc0 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
12fd0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
12fe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12ff0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
13000 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
13010 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
13020 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
13030 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
13040 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
13050 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
13060 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
13070 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
13080 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
13090 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
130a0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
130b0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
130c0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
130d0 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
130e0 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
130f0 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
13100 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
13110 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
13120 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
13130 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
13140 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
13150 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
13160 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
13170 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
13180 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
13190 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
131a0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
131b0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
131c0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
131d0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
131e0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
131f0 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
13200 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
13210 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
13220 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
13230 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  TCL_OK;.}.../***
13240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13250 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20  */./* Init      
13260 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
13270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13280 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
132d0 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
132e0 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
132f0 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
13300 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
13310 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
13320 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
13330 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
13340 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
13350 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
13360 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
13370 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
13380 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
13390 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
133e0 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72  id.Tls_Free(char
133f0 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20   *blockPtr) {.  
13400 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
13410 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f  r = (State *)blo
13420 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69  ckPtr;..    dpri
13430 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
13440 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74      Tls_Clean(st
13450 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66  atePtr);.    ckf
13460 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d  ree(blockPtr);.}
13470 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
13480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
134c0 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20  * Tls_Clean --. 
134d0 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
134e0 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68  ure cleans up wh
134f0 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  en a SSL socket 
13500 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a  based channel. *
13510 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69  .is closed and i
13520 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
13530 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31  nt falls below 1
13540 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20  .  This should. 
13550 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63  *.be called sync
13560 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65  hronously by the
13570 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20   CloseProc, not 
13580 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75  in the. *.Eventu
13590 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63  allyFree callbac
135a0 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  k.. *. * Results
135b0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
135c0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
135d0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
135e0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13630 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e  /.void Tls_Clean
13640 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
13650 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ) {.    dprintf(
13660 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
13670 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20  /*.     * we're 
13680 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68  assuming here th
13690 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d  at we're single-
136a0 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f  threaded.     */
136b0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
136c0 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c  r->timer != (Tcl
136d0 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
136e0 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65  L) {..Tcl_Delete
136f0 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61  TimerHandler(sta
13700 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09  tePtr->timer);..
13710 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
13720 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
13730 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
13740 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72  >protos) {..ckfr
13750 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ee(statePtr->pro
13760 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  tos);..statePtr-
13770 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
13780 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
13790 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09  atePtr->bio) {..
137a0 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c  /* This will cal
137b0 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20  l SSL_shutdown. 
137c0 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09  Bug 1414045 */..
137d0 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65  dprintf("BIO_fre
137e0 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74  e_all(%p)", stat
137f0 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f  ePtr->bio);..BIO
13800 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50  _free_all(stateP
13810 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65  tr->bio);..state
13820 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b  Ptr->bio = NULL;
13830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
13840 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
13850 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72  .dprintf("SSL_fr
13860 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ee(%p)", statePt
13870 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72  r->ssl);..SSL_fr
13880 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ee(statePtr->ssl
13890 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73  );..statePtr->ss
138a0 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  l = NULL;.    }.
138b0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
138c0 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54  ->ctx) {..SSL_CT
138d0 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  X_free(statePtr-
138e0 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72  >ctx);..statePtr
138f0 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ctx = NULL;.  
13900 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
13910 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20  ePtr->callback) 
13920 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
13930 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61  unt(statePtr->ca
13940 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50  llback);..stateP
13950 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e  tr->callback = N
13960 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
13970 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  f (statePtr->pas
13980 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65  sword) {..Tcl_De
13990 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
139a0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
139b0 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  .statePtr->passw
139c0 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ord = NULL;.    
139d0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
139e0 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c  tr->vcmd) {..Tcl
139f0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _DecrRefCount(st
13a00 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
13a10 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
13a20 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
13a30 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
13a40 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20  ning");.}...#if 
13a50 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
13a60 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49  N > 8.#define MI
13a70 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a  N_VERSION "9.0".
13a80 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49  #else.#define MI
13a90 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a  N_VERSION "8.5".
13aa0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  #endif../*. *---
13ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13af0 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20  . *. * Tls_Init 
13b00 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73  --. *. *.This is
13b10 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69   a package initi
13b20 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64  alization proced
13b30 75 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61  ure, which is ca
13b40 6c 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77  lled. *.by Tcl w
13b50 68 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65  hen this package
13b60 20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20   is to be added 
13b70 74 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65  to an interprete
13b80 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
13b90 3a 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65  :  Ssl configure
13ba0 64 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a  d and loaded. *.
13bb0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
13bc0 0a 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20  . *. create the 
13bd0 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69  ssl command, ini
13be0 74 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74  tialize ssl cont
13bf0 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ext. *. *-------
13c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
13c40 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54  .DLLEXPORT int T
13c50 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ls_Init(Tcl_Inte
13c60 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
13c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73    const char tls
13c80 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20  TclInitScript[] 
13c90 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c  = {.#include "tl
13ca0 73 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20  s.tcl.h"..0x00. 
13cb0 20 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e     };..    dprin
13cc0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23  tf("Called");..#
13cd0 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  ifdef USE_TCL_ST
13ce0 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  UBS.    if (Tcl_
13cf0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
13d00 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30  , MIN_VERSION, 0
13d10 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
13d20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13d30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13d40 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75   if (Tcl_PkgRequ
13d50 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c  ire(interp, "Tcl
13d60 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20  ", MIN_VERSION, 
13d70 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  0) == NULL) {..r
13d80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13d90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
13da0 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d  TlsLibInit(0) !=
13db0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
13dc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13dd0 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  erp, "could not 
13de0 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c  initialize SSL l
13df0 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a  ibrary", (char *
13e00 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
13e10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13e20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  }..    Tcl_Creat
13e30 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13e40 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63  rp, "tls::connec
13e50 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f  tion", Connectio
13e60 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c  nInfoObjCmd, (Cl
13e70 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
13e80 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
13e90 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
13ea0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
13eb0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
13ec0 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20  ls::handshake", 
13ed0 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c  HandshakeObjCmd,
13ee0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
13ef0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
13f00 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
13f10 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
13f20 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13f30 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c  , "tls::import",
13f40 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28   ImportObjCmd, (
13f50 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
13f60 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
13f70 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
13f80 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
13f90 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13fa0 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73  "tls::misc", Mis
13fb0 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  cObjCmd, (Client
13fc0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
13fd0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
13fe0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
13ff0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
14000 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
14010 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70  unimport", Unimp
14020 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
14030 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
14040 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
14050 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
14060 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
14070 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
14080 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75  ::status", Statu
14090 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
140a0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
140b0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
140c0 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 6c  ) NULL);..    Tl
140d0 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73  s_DigestCommands
140e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c  (interp);.    Tl
140f0 73 5f 45 6e 63 72 79 70 74 43 6f 6d 6d 61 6e 64  s_EncryptCommand
14100 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  s(interp);.    T
14110 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 28  ls_InfoCommands(
14120 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c 73  interp);.    Tls
14130 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73 28 69 6e 74  _KDFCommands(int
14140 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 52 61  erp);.    Tls_Ra
14150 6e 64 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72  ndCommands(inter
14160 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74  p);..    if (int
14170 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c  erp) {..Tcl_Eval
14180 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49  (interp, tlsTclI
14190 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20  nitScript);.    
141a0 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  }..    return Tc
141b0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
141c0 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d  erp, PACKAGE_NAM
141d0 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  E, PACKAGE_VERSI
141e0 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ON);.}../*. *---
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14220 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53  ---*. *. *.Tls_S
14230 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  afeInit --. *. *
14240 09 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 2d 2d 2d 2d 2d 2d  ----------------
14270 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70  -*. *.Standard p
14280 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65  rocedure require
14290 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09  d by 'load'.. *.
142a0 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73  Initializes this
142b0 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61   extension for a
142c0 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65   safe interprete
142d0 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.. *.----------
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 2d 2d 2d  ----------------
14300 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
14310 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
14320 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27  As of 'Tls_Init'
14330 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
14340 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63  *..A standard Tc
14350 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  l error code.. *
14360 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44  ---------*. */.D
143a0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
143b0 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
143c0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
143d0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
143e0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
143f0 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72  n(Tls_Init(inter
14400 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  p));.}../*. *---
14410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14440 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69  ---*. *. *.TlsLi
14450 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  bInit --. *. *.-
14460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
14490 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
144a0 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65  SSL library once
144b0 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   per application
144c0 0a 20 2a 09 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 2d 2d 2d 2d  ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144f0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
14500 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e   effects:. *..in
14510 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
14520 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75  brary. *. *.Resu
14530 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a  lt:. *..none. *.
14540 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
14580 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
14590 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
145a0 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74  lize) {.    stat
145b0 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
145c0 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
145d0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
145e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
145f0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
14600 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
14610 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74  EADS).    size_t
14620 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64   num_locks;.#end
14630 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e  if..    if (unin
14640 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20  itialize) {..if 
14650 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
14660 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41  ..    dprintf("A
14670 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
14680 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65  lize, but we are
14690 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
146a0 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e  ");...    return
146b0 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64  (TCL_OK);..}...d
146c0 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
146d0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b   uninitialize");
146e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
146f0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
14700 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
14710 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
14720 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  xLock(&init_mx);
14730 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a  ...if (locks) {.
14740 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29  .    free(locks)
14750 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e  ;..    locks = N
14760 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43  ULL;..    locksC
14770 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e  ount = 0;..}.#en
14780 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64  dif..initialized
14790 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 0;..#if defin
147a0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
147b0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
147c0 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c  CL_THREADS)..Tcl
147d0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e  _MutexUnlock(&in
147e0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a  it_mx);.#endif..
147f0 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b  .return(TCL_OK);
14800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
14810 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
14820 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
14830 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
14840 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75  d value");..retu
14850 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20  rn(status);.    
14860 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
14870 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
14880 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
14890 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
148a0 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
148b0 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63      Tcl_MutexLoc
148c0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
148d0 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69  dif.    initiali
148e0 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65  zed = 1;..#if de
148f0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
14900 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
14910 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
14920 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31     num_locks = 1
14930 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74  ;.    locksCount
14940 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63   = (int) num_loc
14950 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20  ks;.    locks = 
14960 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c  malloc(sizeof(*l
14970 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b  ocks) * num_lock
14980 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c  s);.    memset(l
14990 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocks, 0, sizeof(
149a0 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f  *locks) * num_lo
149b0 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  cks);.#endif..  
149c0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
149d0 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61  BOTH libcrypto a
149e0 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20  nd libssl. */.  
149f0 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73    OPENSSL_init_s
14a00 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  sl(OPENSSL_INIT_
14a10 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53  LOAD_SSL_STRINGS
14a20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
14a30 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49  LOAD_CRYPTO_STRI
14a40 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49  NGS..| OPENSSL_I
14a50 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48  NIT_ADD_ALL_CIPH
14a60 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  ERS | OPENSSL_IN
14a70 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53  IT_ADD_ALL_DIGES
14a80 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  TS, NULL);..    
14a90 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c  BIO_new_tcl(NULL
14aa0 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  , 0);..#if 0.   
14ab0 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54   /*.     * XXX:T
14ac0 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73  ODO: Remove this
14ad0 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63   code and replac
14ae0 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63  e it with a chec
14af0 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f  k.     * for eno
14b00 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20  ugh entropy and 
14b10 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72  do not try to cr
14b20 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20  eate our own.   
14b30 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74    * terrible ent
14b40 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ropy.     */.   
14b50 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20   /*.     * Seed 
14b60 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  the random numbe
14b70 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74  r generator in t
14b80 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a  he SSL library,.
14b90 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65       * using the
14ba0 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72   do/while constr
14bb0 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  uct because of t
14bc0 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74  he bug note in t
14bd0 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53  he.     * OpenSS
14be0 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f  L FAQ at http://
14bf0 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f  www.openssl.org/
14c00 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c  support/faq.html
14c10 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20  #USER1.     *.  
14c20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66     * The crux of
14c30 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
14c40 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64  that Solaris 7 d
14c50 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20  oes not have a. 
14c60 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f      * /dev/rando
14c70 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f  m or /dev/urando
14c80 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63  m device so it c
14c90 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f  annot gather eno
14ca0 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f  ugh.     * entro
14cb0 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44  py from the RAND
14cc0 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53  _seed() when TLS
14cd0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64   initializes and
14ce0 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20   refuses.     * 
14cf0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45  to go further. E
14d00 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
14d10 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69  of OpenSSL carri
14d20 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73  ed on regardless
14d30 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72  ..     */.    sr
14d40 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  and((unsigned in
14d50 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20  t) time((time_t 
14d60 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64  *) NULL));.    d
14d70 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b  o {..for (i = 0;
14d80 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a   i < 16; i++) {.
14d90 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d  .    rnd_seed[i]
14da0 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32   = 1 + (char) (2
14db0 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52  55.0 * rand()/(R
14dc0 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09  AND_MAX+1.0));..
14dd0 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64  }..RAND_seed(rnd
14de0 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e  _seed, sizeof(rn
14df0 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20  d_seed));.    } 
14e00 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74  while (RAND_stat
14e10 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64  us() != 1);.#end
14e20 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
14e30 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
14e40 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
14e50 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c  THREADS).    Tcl
14e60 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e  _MutexUnlock(&in
14e70 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a  it_mx);.#endif..
14e80 20 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75      return(statu
14e90 73 29 3b 0a 7d 0a                                s);.}.