Hex Artifact Content

Artifact 94f84a44e74d3ad4ba1336ed0f5e6eece5edc9c5329d3e71dee0a316baad1bf7:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e 63  nssl/rsa.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61  lude <openssl/sa
03c0: 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d  festack.h>../* M
03d0: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69  in OpenSSL versi
03e0: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  on */.#if OPENSS
03f0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
0400: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23   < 0x10101000L.#
0410: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e  error "Only Open
0420: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61  SSL v1.1.1 or la
0430: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  ter is supported
0440: 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 2a  ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69  tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29  ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e   \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 20  ULL) ? (char *) 
04a0: 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54  NULL : \...Tcl_T
04b0: 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
04c0: 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20  (interp, (key), 
04d0: 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20  (dsp)))..static 
04e0: 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69  SSL_CTX *CTX_Ini
04f0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
0500: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
0510: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
0520: 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63   *key,...char *c
0530: 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65  ertfile, unsigne
0540: 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31  d char *key_asn1
0550: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
0560: 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e  *cert_asn1,...in
0570: 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20  t key_asn1_len, 
0580: 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65  int cert_asn1_le
0590: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
05a0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09   char *CAfile,..
05b0: 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20  .char *ciphers, 
05c0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
05d0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
05e0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a  har *DHparams);.
05f0: 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c  .static int.TlsL
0600: 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69  ibInit(int unini
0610: 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69  tialize);..#defi
0620: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  ne TLS_PROTO_SSL
0630: 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20  2..0x01.#define 
0640: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09  TLS_PROTO_SSL3..
0650: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x02.#define TLS
0660: 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30  _PROTO_TLS1..0x0
0670: 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  4.#define TLS_PR
0680: 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a  OTO_TLS1_1.0x08.
0690: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
06a0: 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64  O_TLS1_2.0x10.#d
06b0: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
06c0: 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66  TLS1_3.0x20.#def
06d0: 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67  ine ENABLED(flag
06e0: 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29  , mask).(((flag)
06f0: 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d   & (mask)) == (m
0700: 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53  ask))..#define S
0710: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53  SLKEYLOGFILE.."S
0720: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f  SLKEYLOGFILE"../
0730: 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 65  *. * Thread-Safe
0740: 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23   TLS Code. */..#
0750: 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44  ifdef TCL_THREAD
0760: 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 53  S.#define OPENSS
0770: 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 53  L_THREAD_DEFINES
0780: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
0790: 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e 68  sl/opensslconf.h
07a0: 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  >..#ifdef OPENSS
07b0: 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75  L_THREADS.#inclu
07c0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70  de <openssl/cryp
07d0: 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  to.h>.#include <
07e0: 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a  openssl/ssl.h>..
07f0: 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f  /*. * Threaded o
0800: 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  peration require
0810: 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61  s locking callba
0820: 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f  cks. * Based fro
0830: 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c  m /crypto/cryptl
0840: 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20  ib.c of OpenSSL 
0850: 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20  and NSOpenSSL.. 
0860: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d  */..static Tcl_M
0870: 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55  utex *locks = NU
0880: 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  LL;.static int l
0890: 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73  ocksCount = 0;.s
08a0: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20  tatic Tcl_Mutex 
08b0: 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 20  init_mx;.#endif 
08c0: 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  /* OPENSSL_THREA
08d0: 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  DS */.#endif /* 
08e0: 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a  TCL_THREADS */..
08f0: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
0900: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c  *******/./* Call
0910: 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a  backs        */.
0920: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0930: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c  . *. * Eval Call
0990: 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a  back Command --.
09a0: 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62   *. *.Eval callb
09b0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20  ack command and 
09c0: 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73  catch any errors
09d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
09e0: 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.0 = Command r
09f0: 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20  eturned fail or 
0a00: 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43  eval returned TC
0a10: 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43  L_ERROR. *.1 = C
0a20: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a30: 73 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20  success or eval 
0a40: 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a  returned TCL_OK.
0a50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0a60: 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73  ts:. *.Evaluates
0a70: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
0a80: 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  d. *. *---------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
0ad0: 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61  tatic int.EvalCa
0ae0: 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72  llback(Tcl_Inter
0af0: 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65  p *interp, State
0b00: 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f   *statePtr, Tcl_
0b10: 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20  Obj *cmdPtr) {. 
0b20: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20     int code, ok 
0b30: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
0b40: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
0b50: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0b70: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
0b80: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0b90: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
0ba0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0bb0: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0bc0: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0bd0: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0be0: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0bf0: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c00: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c10: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0c20: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0c30: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0c40: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0c50: 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 69 6e  OBAL);.    dprin
0c60: 74 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 63 6b  tf("EvalCallback
0c70: 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a 20 20  : %d", code);.  
0c80: 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43    if (code == TC
0c90: 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 65 63  L_OK) {../* Chec
0ca0: 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72 65 74  k result for ret
0cb0: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63  urn value */..Tc
0cc0: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 3d 20  l_Obj *result = 
0cd0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
0ce0: 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 72  (interp);..if (r
0cf0: 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  esult == NULL ||
0d00: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
0d10: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  bj(interp, resul
0d20: 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f  t, &ok) != TCL_O
0d30: 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d 20 31  K) {..    ok = 1
0d40: 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 52  ;..}..dprintf("R
0d50: 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b 29 3b  esult: %d", ok);
0d60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
0d70: 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74  * Error - reject
0d80: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
0d90: 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 54 63   */..dprintf("Tc
0da0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
0db0: 72 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  r");.#if (TCL_MA
0dc0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
0dd0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
0de0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
0df0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
0e00: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
0e10: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e20: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
0e30: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
0e40: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52      }..    Tcl_R
0e50: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
0e60: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
0e70: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
0e80: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0e90: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rp);.    return 
0ea0: 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ok;.}.../*. *---
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62  . *. * InfoCallb
0f00: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
0f10: 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63  itors SSL connec
0f20: 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a  tion process. *.
0f30: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
0f40: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
0f50: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
0f60: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
0f70: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d  fined). *. *----
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0fc0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a   */.static void.
0fd0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  InfoCallback(con
0fe0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
0ff0: 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29   where, int ret)
1000: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
1010: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
1020: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
1030: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20  a((SSL *)ssl);. 
1040: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
1050: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
1060: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
1070: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
1080: 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 2c 20     char *major, 
1090: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72  *minor;..    dpr
10a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
10b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
10c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
10d0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
10e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20  return;..    if 
10f0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1100: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29  HANDSHAKE_START)
1110: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1120: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
1130: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d  = "start";.    }
1140: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20   else if (where 
1150: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1160: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f  KE_DONE) {..majo
1170: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
1180: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22  ..minor = "done"
1190: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
11a0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
11b0: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72  CB_ALERT)..major
11c0: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73   = "alert";..els
11d0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
11e0: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61  L_ST_CONNECT).ma
11f0: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b  jor = "connect";
1200: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1210: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54   & SSL_ST_ACCEPT
1220: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65  )..major = "acce
1230: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  pt";..else.....m
1240: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  ajor = "unknown"
1250: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20  ;...if (where & 
1260: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69  SSL_CB_READ)..mi
1270: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65  nor = "read";..e
1280: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1290: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d  SSL_CB_WRITE)..m
12a0: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a  inor = "write";.
12b0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12c0: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09  & SSL_CB_LOOP)..
12d0: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a  minor = "loop";.
12e0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12f0: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09  & SSL_CB_EXIT)..
1300: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a  minor = "exit";.
1310: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20  .else.....minor 
1320: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20  = "unknown";.   
1330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
1340: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
1350: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
1360: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d   major, minor, m
1370: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65  essage, and type
1380: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
1390: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
13a0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
13b0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
13c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13e0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
13f0: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22  StringObj("info"
1400: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1420: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1430: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1440: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
1450: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
1460: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
1470: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1480: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1490: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14b0: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a  bj(major, -1));.
14c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
14d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
14f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69  _NewStringObj(mi
1500: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  nor, -1));..    
1510: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1520: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c  CB_ALERT) {..Tcl
1530: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1540: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1550: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1560: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1570: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e  alert_desc_strin
1580: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29  g_long(ret), -1)
1590: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
15a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
15b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
15c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
15d0: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70  bj(SSL_alert_typ
15e0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65  e_string_long(re
15f0: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20  t), -1));.    } 
1600: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  else {..Tcl_List
1610: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1620: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1630: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1640: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65  ingObj(SSL_state
1650: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
1660: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
1670: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1680: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1690: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
16a0: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29  Obj("info", -1))
16b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16c0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
16d0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
16e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
16f0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
1700: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
1710: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
1720: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1730: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
1740: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1790: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  . * MessageCallb
17a0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
17b0: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63  itors SSL protoc
17c0: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20  ol messages. *. 
17d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
17e0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
17f0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
1800: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
1810: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1860: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
1870: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
1880: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73  static void.Mess
1890: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20  ageCallback(int 
18a0: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72  write_p, int ver
18b0: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e  sion, int conten
18c0: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f  t_type, const vo
18d0: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  id *buf, size_t 
18e0: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76  len, SSL *ssl, v
18f0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
1900: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
1910: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
1920: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
1930: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
1940: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
1950: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
1960: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74     char *ver, *t
1970: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69  ype;.    BIO *bi
1980: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  o;.    char buff
1990: 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62  er[15000];.    b
19a0: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20  uffer[0] = 0;.. 
19b0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
19c0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
19d0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
19e0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
19f0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
1a00: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f     switch(versio
1a10: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  n) {.#if OPENSSL
1a20: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
1a30: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
1a40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
1a50: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
1a60: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
1a70: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45      case SSL2_VE
1a80: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53  RSION:..ver = "S
1a90: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  SLv2";..break;.#
1aa0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
1ab0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
1ac0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1ad0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73  NO_SSL3).    cas
1ae0: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL3_VERSION:.
1af0: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a  .ver = "SSLv3";.
1b00: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
1b10: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52     case TLS1_VER
1b20: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1b30: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  Sv1";..break;.  
1b40: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45    case TLS1_1_VE
1b50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b60: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.1";..break;
1b70: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32  .    case TLS1_2
1b80: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1b90: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65   "TLSv1.2";..bre
1ba0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1bb0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_3_VERSION:..ve
1bc0: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09  r = "TLSv1.3";..
1bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1be0: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22  0:..ver = "none"
1bf0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;..break;.    de
1c00: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75  fault:..ver = "u
1c10: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b  nknown";..break;
1c20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
1c30: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65  ch (content_type
1c40: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ) {.    case SSL
1c50: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79  3_RT_HEADER:..ty
1c60: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09  pe = "Header";..
1c70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c80: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f  SSL3_RT_INNER_CO
1c90: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70  NTENT_TYPE:..typ
1ca0: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65  e = "Inner Conte
1cb0: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b  nt Type";..break
1cc0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1cd0: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52  RT_CHANGE_CIPHER
1ce0: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22  _SPEC:..type = "
1cf0: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a  Change Cipher";.
1d00: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d10: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a   SSL3_RT_ALERT:.
1d20: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b  .type = "Alert";
1d30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1d40: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d50: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d60: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b  ndshake";..break
1d70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1d80: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44  RT_APPLICATION_D
1d90: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70  ATA:..type = "Ap
1da0: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b  p Data";..break;
1db0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
1dc0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
1dd0: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61  30000000L.    ca
1de0: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52  se DTLS1_RT_HEAR
1df0: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22  TBEAT:..type = "
1e00: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65  Heartbeat";..bre
1e10: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
1e20: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20  efault:..type = 
1e30: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d  "unknown";.    }
1e40: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63  ..    /* Needs c
1e50: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69  ompile time opti
1e60: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74  on "enable-ssl-t
1e70: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66  race". */.    if
1e80: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77   ((bio = BIO_new
1e90: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21  (BIO_s_mem())) !
1ea0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e  = NULL) {..int n
1eb0: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69  ;..SSL_trace(wri
1ec0: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63  te_p, version, c
1ed0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66  ontent_type, buf
1ee0: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69  , len, ssl, (voi
1ef0: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42  d *)bio);..n = B
1f00: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
1f10: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67  fer, BIO_pending
1f20: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20  (bio) < 15000 ? 
1f30: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1f40: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20   : 14999);..n = 
1f50: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09  (n<0) ? 0 : n;..
1f60: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09  buffer[n] = 0;..
1f70: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28  (void)BIO_flush(
1f80: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  bio);..BIO_free(
1f90: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20  bio);.   }..    
1fa0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
1fb0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
1fc0: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69  n, chan, directi
1fd0: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70  on, version, typ
1fe0: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61  e, and message a
1ff0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
2000: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2010: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
2020: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
2030: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2040: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2050: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2060: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65  ringObj("message
2070: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2080: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2090: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
20a0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
20b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
20c0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
20d0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
20e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2100: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2110: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2120: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53  Obj(write_p ? "S
2130: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64  ent" : "Received
2140: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2150: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2160: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2170: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2180: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29  ingObj(ver, -1))
2190: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
21a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
21b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
21c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
21d0: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  type, -1));.    
21e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
21f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2200: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2210: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
2220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
2230: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2250: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2260: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
2270: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
2280: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
2290: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
22a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
22b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
22c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66  ----. *. * Verif
2310: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  yCallback --. *.
2320: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
2330: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69  certificate vali
2340: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20  dation process. 
2350: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  Used to control 
2360: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20  the. *.behavior 
2370: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52  when the SSL_VER
2380: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73  IFY_PEER flag is
2390: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61   set. This is ca
23a0: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72  lled. *.whenever
23b0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69   a certificate i
23c0: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64  s inspected or d
23d0: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20  ecided invalid. 
23e0: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61  Called for. *.ea
23f0: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69  ch certificate i
2400: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e  n the cert chain
2410: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a  .. *. * Checks:.
2420: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61   *.The certifica
2430: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63  te chain is chec
2440: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  ked starting wit
2450: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65  h the deepest ne
2460: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20  sting level. *. 
2470: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65   (the root CA ce
2480: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77  rtificate) and w
2490: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20  orked upward to 
24a0: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69  the peer's certi
24b0: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73  ficate.. *.All s
24c0: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61  ignatures are va
24d0: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d  lid, current tim
24e0: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73  e is within firs
24f0: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64  t and last valid
2500: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65  ity time.. *.Che
2510: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74  ck that the cert
2520: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65  ificate is issue
2530: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20  d by the issuer 
2540: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75  certificate issu
2550: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  er.. *.Check the
2560: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74   revocation stat
2570: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74  us for each cert
2580: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63  ificate.. *.Chec
2590: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f  k the validity o
25a0: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20  f the given CRL 
25b0: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76  and the cert rev
25c0: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a  ocation status..
25d0: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c   *.Check the pol
25e0: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65  icies of all the
25f0: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a   certificates. *
2600: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76  . * Args. *.prev
2610: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74  erify_ok indicat
2620: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63  es whether the c
2630: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66  ertificate verif
2640: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28  ication passed (
2650: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a  1) or not (0). *
2660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
2670: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64  A callback bound
2680: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d   to the socket m
2690: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ay return one of
26a0: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74  :. *.    0...- t
26b0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
26c0: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64  s deemed invalid
26d0: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74  , send verificat
26e0: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c  ion. *....  fail
26f0: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65  ure alert to pee
2700: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65  r, and terminate
2710: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2720: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72     1...- the cer
2730: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
2740: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e  ed valid, contin
2750: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  ue with handshak
2760: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20  e.. *.    empty 
2770: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e  string.- no chan
2780: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74  ge to certificat
2790: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a  e validation. *.
27a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
27b0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
27c0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
27d0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
27e0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
27f0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
2800: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
2810: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
2820: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
2880: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
2890: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
28a0: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20  RE_CTX *ctx) {. 
28b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
28c0: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73  tr;.    SSL   *s
28d0: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39  sl..= (SSL*)X509
28e0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
28f0: 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f  x_data(ctx, SSL_
2900: 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39  get_ex_data_X509
2910: 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29  _STORE_CTX_idx()
2920: 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65  );.    X509  *ce
2930: 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  rt..= X509_STORE
2940: 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74  _CTX_get_current
2950: 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20  _cert(ctx);.    
2960: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09  State *statePtr.
2970: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
2980: 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b  t_app_data(ssl);
2990: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
29a0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
29b0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
29c0: 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30  int depth..= X50
29d0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
29e0: 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29  error_depth(ctx)
29f0: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d  ;.    int err..=
2a00: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
2a10: 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a  get_error(ctx);.
2a20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
2a30: 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69  lled");.    dpri
2a40: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62  ntf("VerifyCallb
2a50: 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  ack: %d", ok);..
2a60: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2a70: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
2a80: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20  bj*)NULL) {../* 
2a90: 55 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20  Use ok value if 
2aa0: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20  verification is 
2ab0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20  required */..if 
2ac0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67  (statePtr->vflag
2ad0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46  s & SSL_VERIFY_F
2ae0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
2af0: 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ERT) {..    retu
2b00: 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b  rn ok;..} else {
2b10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ..    return 1;.
2b20: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
2b30: 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c   (cert == NULL |
2b40: 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | ssl == NULL) {
2b50: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
2b60: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
2b70: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2b80: 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b  eval callback");
2b90: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2ba0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
2bb0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64  with fn, chan, d
2bc0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20  epth, cert info 
2bd0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e  list, status, an
2be0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a  d error args */.
2bf0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2c00: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2c10: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
2c20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2c30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2c50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
2c60: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rify", -1));.   
2c70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c90: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2ca0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2cb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
2cc0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2cd0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2ce0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2cf0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2d00: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2d10: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63  (depth));.    Tc
2d20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2d30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2d40: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35  mdPtr, Tls_NewX5
2d50: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65  09Obj(interp, ce
2d60: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  rt));.    Tcl_Li
2d70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2d90: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2da0: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  (ok));.    Tcl_L
2db0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2dc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2dd0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
2de0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30  ngObj((char*)X50
2df0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
2e00: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
2e10: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50   -1));..    /* P
2e20: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65  revent I/O while
2e30: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20   callback is in 
2e40: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20  progress */.    
2e50: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2e60: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41  gs |= TLS_TCL_CA
2e70: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20  LLBACK; */..    
2e80: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
2e90: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
2ea0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2eb0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b  (cmdPtr);.    ok
2ec0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
2ed0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
2ee0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
2ef0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2f00: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70  cmdPtr);..    dp
2f10: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c  rintf("VerifyCal
2f20: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72  lback: command r
2f30: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29  esult = %d", ok)
2f40: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  ;..    /* stateP
2f50: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54  tr->flags &= ~(T
2f60: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
2f70: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
2f80: 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c  ok;./* By defaul
2f90: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63  t, leave verific
2fa0: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
2fb0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   */.}.../*. *---
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72  . *. * Tls_Error
3010: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20   --. *. *.Calls 
3020: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72  callback with er
3030: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
3040: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3050: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
3060: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
3070: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
3080: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
3090: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
30a0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
30b0: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
30c0: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45  -. */.void.Tls_E
3120: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74  rror(State *stat
3130: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29  ePtr, char *msg)
3140: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
3150: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
3160: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
3170: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
3180: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
3190: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65   unsigned long e
31a0: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rr;.    statePtr
31b0: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20  ->err = msg;..  
31c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
31d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
31e0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
31f0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
3200: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
3210: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3220: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
3230: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
3240: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
3250: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3260: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3270: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
3280: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
32a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
32b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
32c0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
32d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
32e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
32f0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3300: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3310: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
3320: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
3330: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
3340: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
3350: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3360: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3370: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3380: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3390: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
33a0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
33b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
33c0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
33d0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
33e0: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
33f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3400: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3410: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
3420: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
3430: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
3440: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3450: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
3460: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3470: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
3480: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
3490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
34a0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
34b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
34c0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
34d0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
34e0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
34f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3500: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3510: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
3520: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
3530: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
3540: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
3550: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3560: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
3570: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
3580: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
3590: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
35a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
35b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3600: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20   KeyLogCallback 
3610: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72  --. *. *.Write r
3620: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61  eceived key data
3630: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a   to log file.. *
3640: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3650: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c  --. */.void KeyL
36b0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  ogCallback(const
36c0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
36d0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20   char *line) {. 
36e0: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67     char *str = g
36f0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
3700: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a  ILE);.    FILE *
3710: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  fd;..    dprintf
3720: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3730: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20   if (str) {..fd 
3740: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22  = fopen(str, "a"
3750: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20  );..fprintf(fd, 
3760: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66  "%s\n",line);..f
3770: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
3780: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
37d0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c  . * Password Cal
37e0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43  lback --. *. *.C
37f0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73  alled when a pas
3800: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20  sword is needed 
3810: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3820: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20  y when loading. 
3830: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50  *.or storing a P
3840: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77  EM certificate w
3850: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20  ith encryption. 
3860: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20  Evals callback. 
3870: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74  *.script and ret
3880: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  urns the result 
3890: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20  as the password 
38a0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20  string in buf.. 
38b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
38c0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
38d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
38e0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
38f0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
3900: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77  eturns:. *.Passw
3910: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ord size in byte
3920: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65  s or -1 for an e
3930: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61  */.static int.Pa
3990: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63  sswordCallback(c
39a0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69  har *buf, int si
39b0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20  ze, int rwflag, 
39c0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20  void *udata) {. 
39d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
39e0: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75  tr.= (State *) u
39f0: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  data;.    Tcl_In
3a00: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3a10: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3a20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3a30: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
3a40: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  de;.    Tcl_Size
3a50: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e   len;..    dprin
3a60: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
3a70: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
3a80: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
3a90: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
3aa0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3ab0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
3ac0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
3ad0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3ae0: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3af0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3b00: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3b10: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3b20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3b30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3b40: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3b50: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3b60: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54      if (len > (T
3b70: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29  cl_Size) size-1)
3b80: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f   {...len = (Tcl_
3b90: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20  Size) size-1;.. 
3ba0: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70     }..    strncp
3bb0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3bc0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
3bd0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  buf[len] = '\0';
3be0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3bf0: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20  t) len;..} else 
3c00: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  {..    return -1
3c10: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
3c20: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3c30: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
3c40: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73  n, rwflag, and s
3c50: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ize args */.    
3c60: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
3c70: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
3c80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20  tr->password);. 
3c90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3ca0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3cb0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3cc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61  NewStringObj("pa
3cd0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20  ssword", -1));. 
3ce0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3cf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3d00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3d10: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67  NewIntObj(rwflag
3d20: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3d30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3d40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d50: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
3d60: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ize));..    Tcl_
3d70: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
3d80: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
3d90: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
3da0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3db0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3dc0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
3dd0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
3de0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
3df0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
3e00: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
3e10: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3e20: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3e30: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
3e40: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
3e50: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
3e60: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
3e70: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
3e80: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
3e90: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
3ea0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
3eb0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
3ec0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
3ed0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3ee0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3ef0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
3f00: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3f10: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3f20: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  r);..    /* If s
3f30: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20  uccessful, pass 
3f40: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74  back password st
3f50: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74  ring and truncat
3f60: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f  e if too long */
3f70: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
3f80: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72   TCL_OK) {..char
3f90: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3fa0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
3fb0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
3fc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
3fd0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20  &len);..if (len 
3fe0: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  > (Tcl_Size) siz
3ff0: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20  e-1) {..    len 
4000: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  = (Tcl_Size) siz
4010: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
4020: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
4030: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
4040: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
4050: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
4060: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
4070: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
4080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
4090: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
40a0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
40b0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c    return -1;.}..
40c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4110: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b  Session Callback
4120: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
4130: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
4140: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
4150: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
4160: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e  cache. In TLS 1.
4170: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65  3. *.this may be
4180: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
4190: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74  le times after t
41a0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f  he handshake. Fo
41b0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72  r. *.earlier ver
41c0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c  sions, this will
41d0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72   be received dur
41e0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ing the handshak
41f0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68  e.. *.This is th
4200: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20  e preferred way 
4210: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75  to obtain a resu
4220: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20  mable session.. 
4230: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4240: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4250: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4260: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4270: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
4280: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
4290: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20  0 = error where 
42a0: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20  session will be 
42b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f  immediately remo
42c0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ved from the int
42d0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09  ernal cache.. *.
42e0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72  1 = success wher
42f0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65  e app retains se
4300: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e  ssion in session
4310: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74   cache, and must
4320: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f   call SSL_SESSIO
4330: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f  N_free() when do
4340: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4390: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73  .static int.Sess
43a0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20  ionCallback(SSL 
43b0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
43c0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
43d0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
43e0: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
43f0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
4400: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
4410: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4420: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4430: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4440: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
4450: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4460: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4470: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4480: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4490: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
44a0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
44b0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
44c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
44d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
44e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
44f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
4500: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4510: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
4520: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
4530: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4540: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4550: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4560: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4570: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
4580: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73  h fn, chan, sess
4590: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20  ion id, session 
45a0: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65  ticket, and life
45b0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  time args */.   
45c0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
45d0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
45e0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
45f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4600: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4610: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4620: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
4630: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20  ession", -1));. 
4640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4660: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
4670: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4680: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
4690: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
46a0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  elf), -1));..   
46b0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a   /* Session id *
46c0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64  /.    session_id
46d0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
46e0: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
46f0: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  ulen);.    Tcl_L
4700: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4710: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4720: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4730: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f  rrayObj(session_
4740: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
4750: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  len));..    /* S
4760: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f  ession ticket */
4770: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e  .    SSL_SESSION
4780: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
4790: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
47a0: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  len2);.    Tcl_L
47b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
47c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
47d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
47e0: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
47f0: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
4800: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74  );..    /* Lifet
4810: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20  ime - number of 
4820: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54  seconds */.    T
4830: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4840: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4850: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
4860: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53  LongObj((long) S
4870: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
4880: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
4890: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  int(session)));.
48a0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
48b0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
48c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
48d0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
48e0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
48f0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
4900: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
4910: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4920: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  cmdPtr);..    /*
4930: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f   Return 0 for no
4940: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20  w until session 
4950: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70  handling is comp
4960: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
4970: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61  --. *. * ALPN Ca
49d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
49e0: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62  rs and NPN Callb
49f0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
4a00: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
4a10: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f   protocol (http/
4a20: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63  1.1, h2, h3, etc
4a30: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72  .) selection for
4a40: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67   the. *.incoming
4a50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c   connection. Cal
4a60: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20  led after Hello 
4a70: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62  and server callb
4a80: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27  acks.. *.Where '
4a90: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64  out' is selected
4aa0: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69   protocol and 'i
4ab0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61  n' is the peer a
4ac0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a  dvertised list..
4ad0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4ae0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4af0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4b00: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4b10: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4b20: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4b30: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4b40: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  OK: ALPN protoco
4b50: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
4b60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4b70: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4b80: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
4b90: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e  TAL: There was n
4ba0: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  o overlap betwee
4bb0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20  n the client's. 
4bc0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c  *.    supplied l
4bd0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76  ist and the serv
4be0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
4bf0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4c00: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64   will be aborted
4c10: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
4c20: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20  ERR_NOACK: ALPN 
4c30: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
4c40: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63  ected, e.g., bec
4c50: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09  ause no ALPN. *.
4c60: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72      protocols ar
4c70: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  e configured for
4c80: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
4c90: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4ca0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
4cb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4d00: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  int.ALPNCallback
4d10: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74  (SSL *ssl, const
4d20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4d30: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  *out, unsigned c
4d40: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f  har *outlen,..co
4d50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4d60: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r *in, unsigned 
4d70: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20  int inlen, void 
4d80: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4d90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4da0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4db0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4dc0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4dd0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4de0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4df0: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20  nt code, res;.. 
4e00: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4e10: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4e20: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4e30: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4e40: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4e50: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4e60: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
4e70: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
4e80: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e  if (SSL_select_n
4e90: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67  ext_proto((unsig
4ea0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74  ned char **) out
4eb0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50  , outlen, stateP
4ec0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74  tr->protos, stat
4ed0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
4ee0: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d  ,..in, inlen) ==
4ef0: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47   OPENSSL_NPN_NEG
4f00: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d  OTIATED) {../* M
4f10: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72  atch found */..r
4f20: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4f30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4f40: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c  se {../* OPENSSL
4f50: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20  _NPN_NO_OVERLAP 
4f60: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f  = No overlap, so
4f70: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20   use first item 
4f80: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74  from client prot
4f90: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65  ocol list */..re
4fa0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4fb0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4fc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4fd0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
4fe0: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4ff0: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a  turn res;.    }.
5000: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
5010: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
5020: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65  ith fn, chan, de
5030: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c  pth, cert info l
5040: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64  ist, status, and
5050: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20   error args */. 
5060: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5070: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5080: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5090: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
50a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
50b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
50c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
50d0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
50e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
50f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5100: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5110: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5120: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5130: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5140: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5150: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5160: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5170: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5180: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72  gObj((const char
5190: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a   *) *out, -1));.
51a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
51b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
51c0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
51d0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
51e0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54  es == SSL_TLSEXT
51f0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20  _ERR_OK));..    
5200: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
5210: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
5220: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5230: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
5240: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
5250: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
5260: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
5270: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
5280: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5290: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  OACK;.    } else
52a0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
52b0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
52c0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
52d0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
52e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
52f0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20  LERT_FATAL;.    
5300: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5310: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5320: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5330: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5380: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f   * Advertise Pro
5390: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20  tocols Callback 
53a0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f  for Next Protoco
53b0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e  l Negotiation (N
53c0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c  PN) in ServerHel
53d0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c  lo --. *. *.call
53e0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65  ed when a TLS se
53f0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73  rver needs a lis
5400: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70  t of supported p
5410: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78  rotocols for Nex
5420: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65  t. *.Protocol Ne
5430: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  gotiation.. *. *
5440: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5450: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5460: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75  ects:. *. * Retu
5470: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5480: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
5490: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  NPN protocol sel
54a0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
54b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
54c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
54d0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72  RR_NOACK: NPN pr
54e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
54f0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5500: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5510: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
5560: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69  ef USE_NPN.stati
5570: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63  c int.NPNCallbac
5580: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5590: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
55a0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
55b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65  igned int *outle
55c0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
55d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
55e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
55f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
5600: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5610: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5620: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5630: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5640: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5650: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
5660: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  t protocols list
5670: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
5680: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
5690: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20  NULL) {..*out = 
56a0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
56b0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61  ;..*outlen = sta
56c0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
56d0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
56e0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a  .*out = NULL;..*
56f0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74  outlen = 0;..ret
5700: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5710: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5720: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
5730: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
5740: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c  -. *. * SNI Call
57a0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
57b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
57c0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e  m server-side SN
57d0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63  I hostname selec
57e0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69  tion after recei
57f0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69  ving SNI extensi
5800: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20  on. *.in Client 
5810: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66  Hello. Called af
5820: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61  ter hello callba
5830: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c  ck but before AL
5840: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  PN callback.. *.
5850: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5860: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5870: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
5880: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
5890: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
58a0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
58b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
58c0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
58d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
58e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
58f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
5900: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5910: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  AL: SNI hostname
5920: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5930: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5940: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74  . *.    is abort
5950: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20  ed. Default for 
5960: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f  alert is SSL_AD_
5970: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5980: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  E.. *.SSL_TLSEXT
5990: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
59a0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  NG: SNI hostname
59b0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
59c0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a  , warning alert.
59d0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74   *.    sent (not
59e0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c   supported in TL
59f0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e  Sv1.3). The conn
5a00: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5a10: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5a20: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68  ERR_NOACK: SNI h
5a30: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5a40: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20  ccepted and not 
5a50: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a  acknowledged,. *
5a60: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49  .    e.g. if SNI
5a70: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
5a80: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f  nfigured. The co
5a90: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5aa0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5af0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43  .static int.SNIC
5b00: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5b10: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
5b20: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
5b30: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5b40: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5b50: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
5b60: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
5b70: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
5b80: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
5b90: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
5ba0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
5bb0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
5bc0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64  e = NULL;..    d
5bd0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
5be0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5bf0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5c00: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5c10: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5c20: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5c30: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20    /* Only works 
5c40: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20  for TLS 1.2 and 
5c50: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73  earlier */.    s
5c60: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f  ervername = SSL_
5c70: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
5c80: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
5c90: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a  YPE_host_name);.
5ca0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e      if (!servern
5cb0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d  ame || servernam
5cc0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  e[0] == '\0') {.
5cd0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5ce0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5cf0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
5d00: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
5d10: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
5d20: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5d30: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5d40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
5d50: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
5d60: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
5d70: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  and server name 
5d80: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
5d90: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
5da0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
5db0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
5dc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5dd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5de0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5df0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
5e00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5e10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5e20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
5e30: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
5e40: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
5e50: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5e60: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5e70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5e80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5e90: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5ea0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
5eb0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
5ec0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5ed0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5ee0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5ef0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5f00: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5f10: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5f20: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5f30: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5f40: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5f50: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5f60: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  G;..*alert = SSL
5f70: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5f80: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5f90: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5fa0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  .3 */.    } else
5fb0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
5fc0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5fd0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5fe0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5ff0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
6000: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c  LERT_FATAL;..*al
6010: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
6020: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
6030: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
6040: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
6050: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6060: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6070: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6080: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
60d0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c   *. * ClientHell
60e0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c  o Handshake Call
60f0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
6100: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62   --. *. *.Used b
6110: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d  y server to exam
6120: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e  ine the server n
6130: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
6140: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20  SNI) extension. 
6150: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  *.provided by th
6160: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65  e client in orde
6170: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61  r to select an a
6180: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69  ppropriate certi
6190: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65  ficate to. *.pre
61a0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f  sent, and make o
61b0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
61c0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72  on adjustments r
61d0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20  elevant to that 
61e0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61  server. *.name a
61f0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61  nd its configura
6200: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75  tion. This inclu
6210: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74  des swapping out
6220: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
6230: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74   *.SSL_CTX point
6240: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  er, modifying th
6250: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20  e server's list 
6260: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53  of permitted TLS
6270: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68   versions,. *.ch
6280: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65  anging the serve
6290: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20  r's cipher list 
62a0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  in response to t
62b0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68  he client's ciph
62c0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a  er list, etc.. *
62d0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53  .Called before S
62e0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c  NI and ALPN call
62f0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  backs.. *. * Res
6300: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
6310: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6320: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
6330: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
6340: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
6350: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  des:. *.SSL_CLIE
6360: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20  NT_HELLO_RETRY: 
6370: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
6380: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
6390: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
63a0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
63b0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
63c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
63d0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65  ROR: failure, te
63e0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69  rminate connecti
63f0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f  on. Set alert to
6400: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09   error code.. *.
6410: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6420: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73  _SUCCESS: succes
6430: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
6480: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43  tatic int.HelloC
6490: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
64a0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
64b0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
64c0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
64d0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
64e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
64f0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
6500: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
6510: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
6520: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
6530: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6540: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20  *servername;.   
6550: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6560: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a  char *p;.    siz
6570: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69  e_t len, remaini
6580: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ng;..    dprintf
6590: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
65a0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
65b0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
65c0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
65d0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
65e0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
65f0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
6600: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55   (const SSL *)NU
6610: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f  LL || arg == (vo
6620: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  id *)NULL) {..re
6630: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6640: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6650: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e   }..    /* Get n
6660: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  ames */.    if (
6670: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  !SSL_client_hell
6680: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20  o_get0_ext(ssl, 
6690: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76  TLSEXT_TYPE_serv
66a0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65  er_name, &p, &re
66b0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61  maining) || rema
66c0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
66d0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53  alert = SSL_R_SS
66e0: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41  LV3_ALERT_ILLEGA
66f0: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65  L_PARAMETER;..re
6700: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6710: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6720: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
6730: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ct the length of
6740: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69   the supplied li
6750: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a  st of names. */.
6760: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
6770: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
6780: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
6790: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72  if (len + 2 != r
67a0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
67b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
67c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
67d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
67e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
67f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6800: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d  .    remaining =
6810: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   len;..    /* Th
6820: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69  e list in practi
6830: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69  ce only has a si
6840: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f  ngle element, so
6850: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65   we only conside
6860: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  r the first one.
6870: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6880: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70  ining == 0 || *p
6890: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d  ++ != TLSEXT_NAM
68a0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
68b0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
68c0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
68d0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
68e0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
68f0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6900: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6910: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  ng--;..    /* No
6920: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79  w we can finally
6930: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79   pull out the by
6940: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68  te array with th
6950: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d  e actual hostnam
6960: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
6970: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
6980: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6990: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
69a0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
69b0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
69c0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
69d0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70  }.    len = (*(p
69e0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c  ++) << 8);.    l
69f0: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20  en += *(p++);.  
6a00: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20    if (len + 2 > 
6a10: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
6a20: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6a30: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6a40: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
6a50: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6a60: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
6a70: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
6a80: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61  en;.    serverna
6a90: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
6aa0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72   *)p;..    /* Cr
6ab0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
6ac0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
6ad0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e  an, and server n
6ae0: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ame args */.    
6af0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
6b00: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
6b10: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54  tr->vcmd);.    T
6b20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6b30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6b40: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6b50: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22  tringObj("hello"
6b60: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
6b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6b80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6b90: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
6ba0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
6bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
6bc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
6bd0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
6be0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6bf0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6c00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6c10: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28  bj(servername, (
6c20: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b  Tcl_Size) len));
6c30: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
6c40: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
6c50: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
6c60: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6c70: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
6c80: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
6c90: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
6ca0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
6cb0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6cc0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a  _HELLO_RETRY;..*
6cd0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6ce0: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43  SV1_ALERT_USER_C
6cf0: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20  ANCELLED;.    } 
6d00: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d  else if (code ==
6d10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6d20: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6d30: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
6d40: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  e {..res = SSL_C
6d50: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6d60: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  R;..*alert = SSL
6d70: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6d80: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20  NTERNAL_ERROR;. 
6d90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6da0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6db0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6dc0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  s;.}.../********
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
6de0: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20   Commands       
6df0: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
6e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
6e10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68  -----. *. * Ciph
6e60: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  ersObjCmd -- lis
6e70: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
6e80: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ers. *. *.This p
6e90: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
6ea0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
6eb0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  he "tls::ciphers
6ec0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
6ed0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
6ee0: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70  iphers, based up
6ef0: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  on protocol sele
6f00: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cted.. *. * Resu
6f10: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6f20: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
6f30: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
6f40: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
6f50: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f  ructs and destro
6f60: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ys SSL context (
6f70: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6fc0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6fd0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d  har *protocols[]
6fe0: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73   = {.."ssl2", "s
6ff0: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74  sl3", "tls1", "t
7000: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22  ls1.1", "tls1.2"
7010: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c  , "tls1.3", NULL
7020: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  .};.enum protoco
7030: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32  l {.    TLS_SSL2
7040: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
7050: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
7060: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
7070: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f  S_TLS1_3, TLS_NO
7080: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  NE.};..static in
7090: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t.CiphersObjCmd(
70a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
70b0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
70c0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
70d0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
70e0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
70f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7100: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
7110: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
7120: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
7130: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
7140: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
7150: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62   *sk;.    char b
7160: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
7170: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
7180: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
7190: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
71a0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
71b0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f  *method;.    (vo
71c0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
71d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
71e0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
71f0: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
7200: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
7210: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7220: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7230: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
7240: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
7250: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7260: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7270: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
7280: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7290: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
72a0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
72b0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
72c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
72e0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
72f0: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
7300: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7310: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
7320: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
7330: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7340: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7350: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
7360: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
7370: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
7380: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
7390: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
73a0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
73b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
73c0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
73d0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
73e0: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
73f0: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
7400: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
7410: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7420: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
7430: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
7440: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
7450: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7460: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
7470: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7480: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
7490: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
74a0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
74b0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
74c0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
74d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
74e0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53  ..    method = S
74f0: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62  SLv2_method(); b
7500: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7510: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
7520: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
7530: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7540: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
7550: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7560: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7570: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
7590: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
75a0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
75b0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
75c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
75d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
75e0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
75f0: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
7600: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
7610: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
7620: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
7630: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
7640: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7650: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7660: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7670: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
7680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7690: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
76a0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
76b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
76c0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
76d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
76e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
76f0: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7700: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b   TLSv1_method();
7710: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
7720: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a  case TLS_TLS1_1:
7730: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7740: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7750: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7760: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
7770: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7780: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _1_METHOD)..    
7790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
77a0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
77b0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
77c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
77d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
77e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
77f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7800: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7810: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64  = TLSv1_1_method
7820: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7830: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7840: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _2:.#if defined(
7850: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7860: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7870: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
7880: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7890: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_2_METHOD).. 
78a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
78b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
78c0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
78d0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
78e0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
78f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
7900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7910: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7920: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74  od = TLSv1_2_met
7930: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7940: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7950: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_3:.#if defin
7960: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
7970: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7980: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20  _NO_TLS1_3)..   
7990: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
79a0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
79b0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
79c0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
79d0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
79e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
79f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7a00: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7a10: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
7a20: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
7a30: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
7a40: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
7a50: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53  VERSION);..    S
7a60: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
7a70: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
7a80: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
7a90: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  );..    break;.#
7aa0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a  endif..default:.
7ab0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
7ac0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20  S_method();..   
7ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7ae0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7af0: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
7b00: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c    if (ctx == NUL
7b10: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7b20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
7b30: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
7b40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7b50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7b60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
7b70: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78  sl = SSL_new(ctx
7b80: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  );.    if (ssl =
7b90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7ba0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7bb0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53  rp, GET_ERR_REAS
7bc0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
7bd0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
7be0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
7bf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7c00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c   }..    /* Use l
7c10: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73  ist and order as
7c20: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69   would be sent i
7c30: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  n a ClientHello 
7c40: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  or all available
7c50: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20   ciphers */.    
7c60: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7c70: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  d) {..sk = SSL_g
7c80: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69  et1_supported_ci
7c90: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7ca0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53  } else {..sk = S
7cb0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73  SL_get_ciphers(s
7cc0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
7cd0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20  if (sk != NULL) 
7ce0: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29  {..if (!verbose)
7cf0: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68   {..    const ch
7d00: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a  ar *cp;..    obj
7d10: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7d20: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7d30: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7d40: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7d50: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7d60: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7d70: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7d80: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7d90: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
7da0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
7db0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
7dc0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
7dd0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
7de0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
7df0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7e00: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7e10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7e20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7e30: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7e40: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
7e50: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20   cp, -1));..    
7e60: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
7e70: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7e80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
7e90: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
7ea0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
7eb0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
7ec0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
7ed0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
7ee0: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
7ef0: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
7f00: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
7f10: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
7f20: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
7f30: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
7f40: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
7f50: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
7f60: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
7f70: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
7f80: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7f90: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
7fa0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  uf, (Tcl_Size) s
7fb0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d  trlen(buf));...}
7fc0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63   else {...    Tc
7fd0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7fe0: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e  jPtr, "UNKNOWN\n
7ff0: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 8);...}..    
8000: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75  }..}..if (use_su
8010: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
8020: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
8030: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  ee(sk);..}.    }
8040: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
8050: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
8060: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20  free(ctx);..    
8070: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8080: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
8090: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
80a0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
80b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
8100: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
8110: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8120: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
8130: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8140: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8150: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
8160: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
8170: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
8180: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
8190: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
81a0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
81b0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
81c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
81d0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8220: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
8230: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
8240: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8250: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8260: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8270: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
8280: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8290: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
82a0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
82b0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
82c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
82d0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
82e0: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
82f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8300: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72  1, objv, "");..r
8310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8330: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8340: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
8350: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
8360: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ULL);..#if OPENS
8370: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
8380: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
8390: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
83a0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
83b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
83c0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
83d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
83e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
83f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8400: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
8410: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L2], -1));.#endi
8420: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8430: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8440: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
8450: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
8460: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
8470: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
8480: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8490: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
84a0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
84b0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
84c0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29  [TLS_SSL3], -1))
84d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
84e0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
84f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8500: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
8510: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8520: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
8530: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8540: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8550: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8560: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8570: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8580: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8590: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
85a0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
85b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
85c0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
85d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
85e0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
85f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8600: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8610: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8620: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8630: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
8640: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8660: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
8670: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8680: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
8690: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
86a0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
86b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
86c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
86d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
86e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
86f0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c  ols[TLS_TLS1_2],
8700: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8710: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8720: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
8730: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8740: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_3).    Tcl_Lis
8750: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8760: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8770: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8780: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8790: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_3], -1));.
87a0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
87b0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
87c0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
87d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
87e0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8830: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
8840: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8850: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
8860: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
8870: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
8880: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
8890: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
88a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
88b0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
88c0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
88d0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
88e0: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
88f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8900: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
8910: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
8920: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
8930: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
8980: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65  ic int Handshake
8990: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
89a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
89b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
89c0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
89d0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
89e0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
89f0: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
8a00: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
8a10: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
8a20: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
8a30: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
8a40: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
8a50: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
8a60: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
8a70: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
8a80: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
8a90: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
8aa0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
8ab0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
8ac0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
8ad0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
8ae0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
8af0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8b00: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8b10: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
8b20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8b30: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
8b40: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
8b50: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
8b60: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
8b70: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8b80: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
8b90: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
8ba0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8bb0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8bc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8bd0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
8be0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8bf0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
8c00: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
8c10: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
8c20: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
8c30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8c40: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
8c50: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
8c60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8c70: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8c80: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8c90: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8ca0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
8cb0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
8cc0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
8cd0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8ce0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8cf0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8d00: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
8d10: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
8d20: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
8d30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8d40: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
8d50: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
8d60: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
8d70: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64  ta(chan);..    d
8d80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
8d90: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8da0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ct");.    ret = 
8db0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8dc0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
8dd0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e  r, 1);.    dprin
8de0: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
8df0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a  onnect returned:
8e00: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20   %i", ret);..   
8e10: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20   if (ret < 0 && 
8e20: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ((statePtr->flag
8e30: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
8e40: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41  C) && (err == EA
8e50: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e  GAIN))) {..dprin
8e60: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e  tf("Async set an
8e70: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29  d err = EAGAIN")
8e80: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  ;..ret = 0;.    
8e90: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c  } else if (ret <
8ea0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75   0) {..long resu
8eb0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  lt;..errStr = st
8ec0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
8ed0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8ee0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
8ef0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
8f00: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
8f10: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
8f20: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
8f30: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
8f40: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
8f50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8f60: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
8f70: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
8f80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8f90: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53  .if ((result = S
8fa0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
8fb0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
8fc0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f  sl)) != X509_V_O
8fd0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  K) {..    Tcl_Ap
8fe0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8ff0: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c  p, " due to \"",
9000: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
9010: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
9020: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63  esult), "\"", (c
9030: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d  har *) NULL);..}
9040: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
9050: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
9060: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
9070: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
9080: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
9090: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
90a0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
90b0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
90c0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
90d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
90f0: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
9100: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
9110: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
9120: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
9130: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
9140: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
9150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
9160: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
9170: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
9180: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
9190: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
91a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
91b0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
91c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
91d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
9230: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
9240: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
9250: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
9260: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
9270: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
9280: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
9290: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
92a0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
92b0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
92c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
92d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
92e0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
92f0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
9300: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
9310: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
9320: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9370: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
9380: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
9390: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
93a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
93b0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
93c0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
93d0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
93e0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
93f0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
9400: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
9410: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
9420: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
9430: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
9440: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
9450: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c  _CTX *ctx..= NUL
9460: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
9470: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a  script..= NULL;.
9480: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
9490: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  sword..= NULL;. 
94a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64     Tcl_Obj *vcmd
94b0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
94c0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43  l_DString upperC
94d0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
94e0: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  n, upperChannelB
94f0: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68  locking, upperCh
9500: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75  annelEncoding, u
9510: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9520: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b  ar;.    int idx;
9530: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
9540: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
9550: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  ...= TLS_TCL_INI
9560: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
9570: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63  r...= 0;./* is c
9580: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69  onnection incomi
9590: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20  ng or outgoing? 
95a0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  */.    char *key
95b0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
95c0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
95d0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  ..= NULL;.    un
95e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
95f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9600: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09  l_Size key_len..
9610: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
9620: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20  d char *cert..= 
9630: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
9640: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30  ze cert_len..= 0
9650: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9660: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ers..= NULL;.   
9670: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
9680: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tes..= NULL;.   
9690: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d   char *CAfile..=
96a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
96b0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b  *CApath..= NULL;
96c0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
96d0: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ams..= NULL;.   
96e0: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d   char *model...=
96f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9700: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e  *servername..= N
9710: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
9720: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
9730: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20   Indication */. 
9740: 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e     char *session
9750: 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  _id..= NULL;.   
9760: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09   Tcl_Obj *alpn..
9770: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
9780: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
9790: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
97a0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
97b0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
97c0: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
97d0: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
97e0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
97f0: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
9800: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
9810: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
9820: 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28  shake = 0;.    (
9830: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
9840: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
9850: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
9860: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
9870: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9880: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
9890: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
98a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
98b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
98c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
98d0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
98e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
98f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9900: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
9910: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
9920: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
9930: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9940: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
9950: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9960: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9970: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
9980: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
9990: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
99a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
99b0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
99c0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
99d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
99e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
99f0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
9a00: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
9a10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
9a20: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9a30: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  ring(objv[1]), N
9a40: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
9a50: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
9a60: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
9a70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9a80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
9a90: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
9aa0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
9ab0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
9ac0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
9ad0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
9ae0: 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20  .    for (idx = 
9af0: 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69  2; idx < objc; i
9b00: 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f  dx++) {..char *o
9b10: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
9b20: 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a  ng(objv[idx]);..
9b30: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
9b40: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
9b50: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22  ..OPTOBJ("-alpn"
9b60: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52  , alpn);..OPTSTR
9b70: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74  ("-cadir", CApat
9b80: 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  h);..OPTSTR("-ca
9b90: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a  file", CAfile);.
9ba0: 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22  .OPTBYTE("-cert"
9bb0: 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e  , cert, cert_len
9bc0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72  );..OPTSTR("-cer
9bd0: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65  tfile", certfile
9be0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
9bf0: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  her", ciphers);.
9c00: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9c10: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  s", ciphers);..O
9c20: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75  PTSTR("-ciphersu
9c30: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69  ites", ciphersui
9c40: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  tes);..OPTOBJ("-
9c50: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74  command", script
9c60: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70  );..OPTSTR("-dhp
9c70: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73  arams", DHparams
9c80: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65  );..OPTBYTE("-ke
9c90: 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e  y", key, key_len
9ca0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79  );..OPTSTR("-key
9cb0: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b  file", keyfile);
9cc0: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c  ..OPTSTR("-model
9cd0: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f  ", model);..OPTO
9ce0: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20  BJ("-password", 
9cf0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42  password);..OPTB
9d00: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73  OOL("-post_hands
9d10: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64  hake", post_hand
9d20: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  shake);..OPTBOOL
9d30: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71  ("-request", req
9d40: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
9d50: 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75  "-require", requ
9d60: 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  ire);..OPTINT("-
9d70: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c  security_level",
9d80: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9d90: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9da0: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9db0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9dc0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9dd0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9de0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9df0: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9e00: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9e10: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9e20: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9e30: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9e40: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9e50: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9e60: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9e70: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9e80: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9e90: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9ea0: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9eb0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9ec0: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9ed0: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9ee0: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9ef0: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
9f00: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
9f10: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c  , -ciphersuites,
9f20: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61   -command, -dhpa
9f30: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79  rams, -key, -key
9f40: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70  file, -model, -p
9f50: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68  assword, -post_h
9f60: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65  andshake, -reque
9f70: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73  st, -require, -s
9f80: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d  ecurity_level, -
9f90: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e  server, -servern
9fa0: 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64  ame, -session_id
9fb0: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
9fc0: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20  -tls1, -tls1.1, 
9fd0: 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33  -tls1.2, -tls1.3
9fe0: 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f  , or -validateco
9ff0: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72  mmand");...retur
a000: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a010: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
a020: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53  st)..verify |= S
a030: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
a040: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
a050: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
a060: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
a070: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ire).verify |= S
a080: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
a090: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
a0a0: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
a0b0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
a0c0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e).verify |= SSL
a0d0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
a0e0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28  DSHAKE;.    if (
a0f0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65  verify == 0)..ve
a100: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46  rify = SSL_VERIF
a110: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f  Y_NONE;..    pro
a120: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c  to |= (ssl2 ? TL
a130: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30  S_PROTO_SSL2 : 0
a140: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a150: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl3 ? TLS_PROT
a160: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20  O_SSL3 : 0);.   
a170: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20   proto |= (tls1 
a180: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
a190: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a1a0: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c   |= (tls1_1 ? TL
a1b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a  S_PROTO_TLS1_1 :
a1c0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
a1d0: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f  = (tls1_2 ? TLS_
a1e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30  PROTO_TLS1_2 : 0
a1f0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a200: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52  (tls1_3 ? TLS_PR
a210: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b  OTO_TLS1_3 : 0);
a220: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74  ..    /* reset t
a230: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20  o NULL if blank 
a240: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20  string provided 
a250: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20  */.    if (cert 
a260: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20  && !*cert)..    
a270: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20      cert.       
a280: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a290: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09  (key && !*key)..
a2a0: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20          key.    
a2b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a2c0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20  if (certfile && 
a2d0: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20  !*certfile)     
a2e0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e      certfile.= N
a2f0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
a300: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c  file && !*keyfil
a310: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20  e)..keyfile.    
a320: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a330: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21  if (ciphers && !
a340: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20  *ciphers).      
a350: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20    ciphers.      
a360: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a370: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26   (ciphersuites &
a380: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73  & !*ciphersuites
a390: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20  ) ciphersuites  
a3a0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a3b0: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41   (CAfile && !*CA
a3c0: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41  file).        CA
a3d0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
a3e0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70  ULL;.    if (CAp
a3f0: 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 29  ath && !*CApath)
a400: 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 09  .        CApath.
a410: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a420: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
a430: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
a440: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
a450: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a460: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
a470: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
a480: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
a490: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
a4a0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
a4b0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
a4c0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
a4d0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
a4e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
a4f0: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
a500: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
a510: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
a520: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
a530: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
a540: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
a550: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
a560: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
a570: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
a580: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a590: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
a5a0: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
a5b0: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a5c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
a5d0: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
a5e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a5f0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
a600: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
a610: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
a620: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
a630: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
a640: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
a650: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
a660: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
a670: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a680: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
a690: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
a6a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a6b0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
a6c0: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
a6d0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a6e0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
a6f0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
a700: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a710: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a720: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
a730: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a740: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
a750: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
a760: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a770: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
a780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a790: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
a7a0: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
a7b0: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
a7c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
a7d0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
a7e0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
a7f0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
a800: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
a810: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
a820: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
a830: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
a840: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a850: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a860: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73  .../*.. * Make s
a870: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
a880: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
a890: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e  annel.. */..chan
a8a0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
a8b0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20  nnel(chan);..if 
a8c0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
a8d0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
a8e0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
a8f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
a900: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a910: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
a920: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
a930: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
a940: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
a950: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20  nnel", (char *) 
a960: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
a970: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
a980: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
a990: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
a9a0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
a9b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a9c0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
a9d0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
a9e0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a9f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
aa00: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
aa10: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
aa20: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
aa30: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
aa40: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
aa50: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
aa60: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
aa70: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
aa80: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
aa90: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e  t, (int) key_len
aaa0: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72  ,..    (int) cer
aab0: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43  t_len, CApath, C
aac0: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
aad0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
aae0: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
aaf0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
ab00: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
ab10: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
ab20: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
ab30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
ab40: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65      }..    state
ab50: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a  Ptr->ctx = ctx;.
ab60: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
ab70: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
ab80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
ab90: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69  nnel works in bi
aba0: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20  nary (for the.  
abb0: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20     * encryption 
abc0: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
abd0: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20  d up)..     */. 
abe0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
abf0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ac00: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
ac10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
ac20: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  t(&upperChannelB
ac30: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63  locking);.    Tc
ac40: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
ac50: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
ac60: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ar);.    Tcl_DSt
ac70: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
ac80: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
ac90: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
aca0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
acb0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61  , chan, "-eofcha
acc0: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  r", &upperChanne
acd0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
ace0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
acf0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ad00: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26  , "-encoding", &
ad10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
ad20: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
ad30: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ad40: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ad50: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75  translation", &u
ad60: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
ad70: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
ad80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ad90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ada0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70  "-blocking", &up
adb0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
adc0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ng);.    Tcl_Set
add0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ade0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
adf0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e  anslation", "bin
ae00: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ary");.    Tcl_S
ae10: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ae20: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ae30: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65  blocking", "true
ae40: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ");.    dprintf(
ae50: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63  "Consuming Tcl c
ae60: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f  hannel %s", Tcl_
ae70: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
ae80: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65  han));.    state
ae90: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f  Ptr->self = Tcl_
aea0: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  StackChannel(int
aeb0: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  erp, Tls_Channel
aec0: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44  Type(), (ClientD
aed0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09  ata) statePtr,..
aee0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20  (TCL_READABLE | 
aef0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63  TCL_WRITABLE), c
af00: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  han);.    dprint
af10: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e  f("Created chann
af20: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63  el named %s", Tc
af30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
af40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
af50: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  );.    if (state
af60: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
af70: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
af80: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73   {../*.. * No us
af90: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61  e of Tcl_Eventua
afa0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20  llyFree because 
afb0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f  no possible Tcl_
afc0: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09  Preserve... */..
afd0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
afe0: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
aff0: 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  Ptr);..Tcl_DStri
b000: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b010: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
b020: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ;..Tcl_DStringFr
b030: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b040: 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f  Encoding);..Tcl_
b050: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b060: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
b070: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
b080: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b090: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74  lBlocking);..ret
b0a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b0b0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65     }..    Tcl_Se
b0c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b0d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b0e0: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61  >self, "-transla
b0f0: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69  tion", Tcl_DStri
b100: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b110: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b120: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
b130: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b140: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b150: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  elf, "-encoding"
b160: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b170: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b180: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20  Encoding));.    
b190: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
b1a0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
b1b0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65  tePtr->self, "-e
b1c0: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74  ofchar", Tcl_DSt
b1d0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b1e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29  ChannelEOFChar))
b1f0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
b200: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
b210: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
b220: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  f, "-blocking", 
b230: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b240: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
b250: 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  ocking));.    Tc
b260: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b270: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
b280: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
b290: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b2a0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b2b0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
b2c0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
b2d0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
b2e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
b2f0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b300: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20  lBlocking);..   
b310: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49   /*.     * SSL I
b320: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
b330: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50     */.    stateP
b340: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
b350: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
b360: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
b370: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
b380: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f  SSL library erro
b390: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  r */..Tcl_Append
b3a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b3b0: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75  couldn't constru
b3c0: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20  ct ssl session: 
b3d0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
b3e0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
b3f0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b400: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b410: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b420: 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49  T", "INIT", "FAI
b430: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b440: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28  ULL);..Tls_Free(
b450: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
b460: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
b470: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b480: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
b490: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61  t host server na
b4a0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  me */.    if (se
b4b0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20  rvername) {../* 
b4c0: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20  Sets the server 
b4d0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
b4e0: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48  (SNI) in ClientH
b4f0: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ello extension *
b500: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30  /../* Per RFC 60
b510: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  66, hostname is 
b520: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20  a ASCII encoded 
b530: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52  string, though R
b540: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46  FC 4366 says UTF
b550: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  -8. */..if (!SSL
b560: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
b570: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
b580: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b590: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
b5a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b5b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
b5c0: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20  t SNI extension 
b5d0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b5e0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b5f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b600: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b610: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b620: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
b630: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b640: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b650: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
b660: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
b670: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b680: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b690: 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e  }.../* Set hostn
b6a0: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72  ame for peer cer
b6b0: 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d  tificate hostnam
b6c0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69  e verification i
b6d0: 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44  n clients...   D
b6e0: 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74  on't use SSL_set
b6f0: 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20  1_host since it 
b700: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e  has limitations.
b710: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64   */..if (!SSL_ad
b720: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72  d1_host(statePtr
b730: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
b740: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  e)) {..    Tcl_A
b750: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b760: 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73  rp, "Set DNS hos
b770: 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c  tname failed: ",
b780: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
b790: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
b7a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b7b0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b7c0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b7d0: 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46  , "HOSTNAME", "F
b7e0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b7f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
b800: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
b810: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72  type *) statePtr
b820: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b830: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
b840: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d   }..    /* Resum
b850: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  e session id */.
b860: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f      if (session_
b870: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73  id && strlen(ses
b880: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f  sion_id) <= SSL_
b890: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47  MAX_SID_CTX_LENG
b8a0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65  TH) {../* SSL_se
b8b0: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09  t_session() */..
b8c0: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e  if (!SSL_SESSION
b8d0: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74  _set1_id_context
b8e0: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e  (SSL_get_session
b8f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
b900: 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ...(const unsign
b910: 65 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 69  ed char *) sessi
b920: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64  on_id, (unsigned
b930: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73   int) strlen(ses
b940: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20  sion_id))) {..  
b950: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b960: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75  lt(interp, "Resu
b970: 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65  me session faile
b980: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b990: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b9a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b9b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b9c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b9d0: 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22  PORT", "SESSION"
b9e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b9f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
ba00: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
ba10: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
ba20: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
ba30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
ba40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
ba50: 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f  nable Applicatio
ba60: 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c  n-Layer Protocol
ba70: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78   Negotiation. Ex
ba80: 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70  amples are: http
ba90: 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c  /1.0,..http/1.1,
baa0: 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d   h2, h3, ftp, im
bab0: 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63  ap, pop3, xmpp-c
bac0: 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76  lient, xmpp-serv
bad0: 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65  er, mqtt, irc, e
bae0: 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61  tc. */.    if (a
baf0: 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65  lpn) {../* Conve
bb00: 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e  rt a TCL list in
bb10: 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  to a protocol-li
bb20: 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61  st in wire-forma
bb30: 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63  t */..unsigned c
bb40: 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b  har *protos, *p;
bb50: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70  ..unsigned int p
bb60: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09  rotos_len = 0;..
bb70: 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b  Tcl_Size cnt, i;
bb80: 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62  ..int j;..Tcl_Ob
bb90: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28  j **list;...if (
bba0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
bbb0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61  ements(interp, a
bbc0: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  lpn, &cnt, &list
bbd0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
bbe0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
bbf0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
bc00: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
bc10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bc20: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
bc30: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  ne the memory re
bc40: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70  quired for the p
bc50: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
bc60: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
bc70: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
bc80: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
bc90: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20  romObj(list[i], 
bca0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
bcb0: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54  len > 255) {...T
bcc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bcd0: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72  interp, "ALPN pr
bce0: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f  otocol names too
bcf0: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29   long", (char *)
bd00: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65   NULL);...Tcl_Se
bd10: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
bd20: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
bd30: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49  T", "ALPN", "FAI
bd40: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
bd50: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65  ULL);...Tls_Free
bd60: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
bd70: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09  *) statePtr);...
bd80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bd90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72  ;..    }..    pr
bda0: 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20  otos_len += 1 + 
bdb0: 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09  (int) len;..}...
bdc0: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d  /* Build the com
bdd0: 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  plete protocol-l
bde0: 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d  ist */..protos =
bdf0: 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f   ckalloc(protos_
be00: 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63  len);../* protoc
be10: 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74  ol-lists consist
be20: 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68   of 8-bit length
be30: 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20  -prefixed, byte 
be40: 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20  strings */..for 
be50: 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74  (j = 0, p = prot
be60: 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b  os; j < cnt; j++
be70: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73  ) {..    char *s
be80: 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  tr = Tcl_GetStri
be90: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a  ngFromObj(list[j
bea0: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a  ], &len);..    *
beb0: 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  p++ = (unsigned 
bec0: 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20  char) len;..    
bed0: 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28  memcpy(p, str, (
bee0: 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20  size_t) len);.. 
bef0: 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a     p += len;..}.
bf00: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70  ../* SSL_set_alp
bf10: 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61  n_protos makes a
bf20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f   copy of the pro
bf30: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f  tocol-list */../
bf40: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e  * Note: This fun
bf50: 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74  ction reverses t
bf60: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
bf70: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69  convention */..i
bf80: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  f (SSL_set_alpn_
bf90: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d  protos(statePtr-
bfa0: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72  >ssl, protos, pr
bfb0: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20  otos_len)) {..  
bfc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
bfd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
bfe0: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66  ALPN protocols f
bff0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
c000: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
c010: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
c020: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
c030: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
c040: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e   "IMPORT", "ALPN
c050: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
c060: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
c070: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
c080: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
c090: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66  tePtr);..    ckf
c0a0: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20  ree(protos);..  
c0b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c0c0: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72  OR;..}.../* Stor
c0d0: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  e protocols list
c0e0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70   */..statePtr->p
c0f0: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a  rotos = protos;.
c100: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
c110: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c  s_len = protos_l
c120: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  en;.    } else {
c130: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
c140: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74  os = NULL;..stat
c150: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
c160: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
c170: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43   /*.     * SSL C
c180: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f  allbacks.     */
c190: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70  .    SSL_set_app
c1a0: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e  _data(statePtr->
c1b0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
c1c0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74  tePtr);./* point
c1d0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20   back to us */. 
c1e0: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66     SSL_set_verif
c1f0: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  y(statePtr->ssl,
c200: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43   verify, VerifyC
c210: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
c220: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62  L_set_info_callb
c230: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ack(statePtr->ss
c240: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29  l, InfoCallback)
c250: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61  ;..    /* Callba
c260: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67  ck for observing
c270: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67   protocol messag
c280: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50  es */.#ifndef OP
c290: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41  ENSSL_NO_SSL_TRA
c2a0: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53  CE.    /* void S
c2b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63  SL_CTX_set_msg_c
c2c0: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74  allback_arg(stat
c2d0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64  ePtr->ctx, (void
c2e0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20   *)statePtr);.  
c2f0: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73    void SSL_CTX_s
c300: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28  et_msg_callback(
c310: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d  statePtr->ctx, M
c320: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b  essageCallback);
c330: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
c340: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
c350: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c360: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c370: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d  );.    SSL_set_m
c380: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  sg_callback(stat
c390: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61  ePtr->ssl, Messa
c3a0: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e  geCallback);.#en
c3b0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  dif..    /* Crea
c3c0: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42  te Tcl_Channel B
c3d0: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  IO Handler */.  
c3e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
c3f0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28  o.= BIO_new_tcl(
c400: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f  statePtr, BIO_NO
c410: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74  CLOSE);.    stat
c420: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f  ePtr->bio.= BIO_
c430: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29  new(BIO_f_ssl())
c440: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  ;..    if (serve
c450: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20  r) {../* Server 
c460: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53  callbacks */..SS
c470: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74  L_CTX_set_tlsext
c480: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28  _servername_arg(
c490: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28  statePtr->ctx, (
c4a0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c4b0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  ;..SSL_CTX_set_t
c4c0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
c4d0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c4e0: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c  tr->ctx, SNICall
c4f0: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  back);..SSL_CTX_
c500: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  set_client_hello
c510: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c520: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b  x, HelloCallback
c530: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c540: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50  tr);..if (stateP
c550: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55  tr->protos != NU
c560: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43  LL) {..    SSL_C
c570: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65  TX_set_alpn_sele
c580: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
c590: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
c5a0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c5b0: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45  Ptr);.#ifdef USE
c5c0: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c  _NPN..    if (tl
c5d0: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73  s1_2 == 0 && tls
c5e0: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53  1_3 == 0) {...SS
c5f0: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70  L_CTX_set_next_p
c600: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64  rotos_advertised
c610: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c620: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  x, NPNCallback, 
c630: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c640: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66  );..    }.#endif
c650: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  ..}.../* Enable 
c660: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63  server to send c
c670: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65  ert request afte
c680: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53  r handshake (TLS
c690: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f   1.3 only) */../
c6a0: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74  * A write operat
c6b0: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c  ion must take pl
c6c0: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74  ace for the Cert
c6d0: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20  ificate Request 
c6e0: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74  to be..   sent t
c6f0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68  o the client, th
c700: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77  is can be done w
c710: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73  ith SSL_do_hands
c720: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28  hake(). */..if (
c730: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f  request && post_
c740: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73  handshake && tls
c750: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  1_3) {..    SSL_
c760: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f  verify_client_po
c770: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61  st_handshake(sta
c780: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a  tePtr->ssl);..}.
c790: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74  ../* set automat
c7a0: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69  ic curve selecti
c7b0: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65  on */..SSL_set_e
c7c0: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74  cdh_auto(statePt
c7d0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a  r->ssl, 1);.../*
c7e0: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65   Set server mode
c7f0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66   */..statePtr->f
c800: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
c810: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74  SERVER;..SSL_set
c820: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74  _accept_state(st
c830: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
c840: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43    } else {../* C
c850: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20  lient callbacks 
c860: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
c870: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  N..if (statePtr-
c880: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20  >protos != NULL 
c890: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  && tls1_2 == 0 &
c8a0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c8b0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
c8c0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c  t_next_proto_sel
c8d0: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c8e0: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c8f0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c900: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  ePtr);..}.#endif
c910: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61  .../* Session ca
c920: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54  ching */..SSL_CT
c930: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_set_session_ca
c940: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
c950: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53  r->ctx, SSL_SESS
c960: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20  _CACHE_CLIENT | 
c970: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e  SSL_SESS_CACHE_N
c980: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45  O_INTERNAL_STORE
c990: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73  );..SSL_CTX_sess
c9a0: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74  _set_new_cb(stat
c9b0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69  ePtr->ctx, Sessi
c9c0: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f  onCallback);.../
c9d0: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61  * Enable post ha
c9e0: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69  ndshake Authenti
c9f0: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e  cation extension
ca00: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20  . TLS 1.3 only, 
ca10: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09  not http/2. */..
ca20: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
ca30: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b  ost_handshake) {
ca40: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f  ..    SSL_set_po
ca50: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74  st_handshake_aut
ca60: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  h(statePtr->ssl,
ca70: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74   1);..}.../* Set
ca80: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a   client mode */.
ca90: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74  .SSL_set_connect
caa0: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
cab0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
cac0: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61   SSL_set_bio(sta
cad0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74  tePtr->ssl, stat
cae0: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61  ePtr->p_bio, sta
caf0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20  tePtr->p_bio);. 
cb00: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73     BIO_set_ssl(s
cb10: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74  tatePtr->bio, st
cb20: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f  atePtr->ssl, BIO
cb30: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20  _NOCLOSE);..    
cb40: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66  /*.     * End of
cb50: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a   SSL Init.     *
cb60: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  /.    dprintf("R
cb70: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63  eturning %s", Tc
cb80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
cb90: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
cba0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  );.    Tcl_SetRe
cbb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
cbc0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  ar *) Tcl_GetCha
cbd0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
cbe0: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f  r->self), TCL_VO
cbf0: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65  LATILE);..    re
cc00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
cc10: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
cc60: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
cc70: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
cc80: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
cc90: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
cca0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
ccb0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
ccc0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
ccd0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
cce0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
ccf0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
cd00: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
cd10: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
cd20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
cd70: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
cd80: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
cd90: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
cda0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
cdb0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
cdc0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
cdd0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
cde0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
cdf0: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
ce00: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
ce10: 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  /.    (void) cli
ce20: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
ce30: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
ce40: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
ce50: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
ce60: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
ce70: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
ce80: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
ce90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cea0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
ceb0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
cec0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
ced0: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
cee0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
cef0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
cf00: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
cf10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cf20: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
cf30: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
cf40: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
cf50: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
cf60: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
cf70: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
cf80: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
cf90: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
cfa0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
cfb0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
cfc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cfd0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
cfe0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
cff0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
d000: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
d010: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
d020: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
d030: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
d040: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d  rp, "TLS", "UNIM
d050: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
d060: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
d070: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d080: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d090: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c      }..    /* Fl
d0a0: 75 73 68 20 61 6e 64 20 70 6f 70 20 63 68 61 6e  ush and pop chan
d0b0: 6e 65 6c 20 66 72 6f 6d 20 73 74 61 63 6b 20 2a  nel from stack *
d0c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  /.    return Tcl
d0d0: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28  _UnstackChannel(
d0e0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 7d  interp, chan);.}
d0f0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
d100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
d140: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f  * CTX_Init -- co
d150: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54  nstruct a SSL_CT
d160: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a  X instance. *. *
d170: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76   Results:. *.A v
d180: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73  alid SSL_CTX ins
d190: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20  tance or NULL.. 
d1a0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
d1b0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
d1c0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
d1d0: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
d1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
d220: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
d230: 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  .CTX_Init(State 
d240: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
d250: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
d260: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c  to, char *keyfil
d270: 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c  e, char *certfil
d280: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
d290: 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67  char *key, unsig
d2a0: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20  ned char *cert, 
d2b0: 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74  int key_len, int
d2c0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20   cert_len, char 
d2d0: 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61  *CApath,.    cha
d2e0: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
d2f0: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
d300: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
d310: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
d320: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54  Hparams) {.    T
d330: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d340: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
d350: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
d360: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
d370: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
d380: 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d  s;.    int off =
d390: 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20   0, abort = 0;. 
d3a0: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
d3b0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
d3c0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
d3d0: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
d3e0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
d3f0: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
d400: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d410: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
d420: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
d430: 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20  elected", (char 
d440: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d450: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
d460: 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c     /* create SSL
d470: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20   context */.#if 
d480: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
d490: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
d4a0: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
d4b0: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
d4c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d4d0: 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL2).    if (EN
d4e0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d4f0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a  _PROTO_SSL2)) {.
d500: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d510: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20  t(interp, "SSL2 
d520: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d530: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d540: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d550: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d560: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d570: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
d580: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d590: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL3).    if (ENA
d5a0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d5b0: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09  PROTO_SSL3)) {..
d5c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d5d0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70  (interp, "SSL3 p
d5e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d5f0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d600: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d610: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d620: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
d630: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
d640: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d650: 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  S1).    if (ENAB
d660: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d670: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54  ROTO_TLS1)) {..T
d680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d690: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30  interp, "TLS 1.0
d6a0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d6b0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d6c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d6d0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d6e0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d6f0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
d700: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d710: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66  O_TLS1_1).    if
d720: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d730: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d740: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
d750: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d760: 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f  "TLS 1.1 protoco
d770: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d780: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d790: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d7a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d7b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d7c0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
d7d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
d7e0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d7f0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d800: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54  TO_TLS1_2)) {..T
d810: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d820: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32  interp, "TLS 1.2
d830: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d840: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d850: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d860: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d870: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d880: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
d890: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d8a0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
d8b0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d8c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d8d0: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  3)) {..Tcl_Appen
d8e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d8f0: 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f  "TLS 1.3 protoco
d900: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d910: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d920: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d930: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
d940: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29   if (proto == 0)
d950: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20   {../* Use full 
d960: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54  range */..SSL_CT
d970: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
d980: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
d990: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
d9a0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
d9b0: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ctx, 0);.    }..
d9c0: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
d9d0: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  o) {.#if OPENSSL
d9e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
d9f0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
da00: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
da10: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
da20: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
da30: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
da40: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64  TO_SSL2:..method
da50: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
da60: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv2_server_metho
da70: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65  d() : SSLv2_clie
da80: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
da90: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
daa0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
dab0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dac0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
dad0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dae0: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
daf0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
db00: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
db10: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
db20: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65   SSLv3_server_me
db30: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63  thod() : SSLv3_c
db40: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
db50: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
db60: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
db70: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
db80: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
db90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dba0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
dbb0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
dbc0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
dbd0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
dbe0: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72  r ? TLSv1_server
dbf0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
dc00: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
dc10: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
dc20: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
dc30: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
dc40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dc50: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
dc60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dc70: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
dc80: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
dc90: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f  O_TLS1_1:..metho
dca0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
dcb0: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65  LSv1_1_server_me
dcc0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31  thod() : TLSv1_1
dcd0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
dce0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
dcf0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dd00: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
dd10: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dd20: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
dd30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
dd40: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
dd50: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
dd60: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
dd70: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
dd80: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_2_server_met
dd90: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f  hod() : TLSv1_2_
dda0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
ddb0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
ddc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
ddd0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
dde0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
ddf0: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
de00: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
de10: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65  :../* Use the ge
de20: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64  neric method and
de30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67   constraint rang
de40: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20  e after context 
de50: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d  is created */..m
de60: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
de70: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
de80: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
de90: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
dea0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
deb0: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65   default:../* Ne
dec0: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20  gotiate highest 
ded0: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c  available SSL/TL
dee0: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65  S version */..me
def0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
df00: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
df10: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
df20: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  nt_method();.#if
df30: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
df40: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
df50: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
df60: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
df70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
df80: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
df90: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dfa0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
dfb0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
dfc0: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
dfd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dfe0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
dff0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
e000: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
e010: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e020: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
e030: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
e040: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
e050: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e060: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
e070: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
e080: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
e090: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e0a0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
e0b0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
e0c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
e0d0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
e0e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e0f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
e100: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
e110: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e120: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
e130: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
e140: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
e150: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
e160: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
e170: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
e180: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
e190: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e1a0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
e1b0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
e1c0: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
e1d0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e1e0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
e1f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e200: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
e210: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e220: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
e230: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
e240: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
e250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e260: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
e270: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20  r();..    ctx = 
e280: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
e290: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74  od);.    if (!ct
e2a0: 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  x) {..return NUL
e2b0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
e2c0: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c   (getenv(SSLKEYL
e2d0: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f  OGFILE)) {..SSL_
e2e0: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63  CTX_set_keylog_c
e2f0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79  allback(ctx, Key
e300: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  LogCallback);.  
e310: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
e320: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
e330: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e340: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
e350: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53  if (proto == TLS
e360: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b  _PROTO_TLS1_3) {
e370: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
e380: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
e390: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
e3a0: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
e3b0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
e3c0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
e3d0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d  _VERSION);.    }
e3e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
e3f0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c  Force cipher sel
e400: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20  ection order by 
e410: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66  server */.    if
e420: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09   (!isServer) {..
e430: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
e440: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
e450: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52  CIPHER_SERVER_PR
e460: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d  EFERENCE);.    }
e470: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
e480: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
e490: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f  x10100000L.    O
e4a0: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61  penSSL_add_all_a
e4b0: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20  lgorithms(); /* 
e4c0: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64  Load ciphers and
e4d0: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64   digests */.#end
e4e0: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  if..    SSL_CTX_
e4f0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78  set_app_data(ctx
e500: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29  , (void*)interp)
e510: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68  ;./* remember th
e520: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  e interpreter */
e530: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e540: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
e550: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c  L_OP_ALL);./* al
e560: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
e570: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
e580: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e590: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  (ctx, SSL_OP_NO_
e5a0: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a  COMPRESSION);./*
e5b0: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73   disable compres
e5c0: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70  sion even if sup
e5d0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53  ported */.    SS
e5e0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
e5f0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a  s(ctx, off);../*
e600: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f   disable protoco
e610: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69  l versions */.#i
e620: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
e630: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
e640: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43  01000L.    SSL_C
e650: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c  TX_set_mode(ctx,
e660: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52   SSL_MODE_AUTO_R
e670: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65  ETRY);./* handle
e680: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20   new handshakes 
e690: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f  in background. O
e6a0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20  n by default in 
e6b0: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a  OpenSSL 1.1.1. *
e6c0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c  /.#endif.    SSL
e6d0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61  _CTX_sess_set_ca
e6e0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32  che_size(ctx, 12
e6f0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  8);..    /* Set 
e700: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70  user defined cip
e710: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69  hers, cipher sui
e720: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74  tes, and securit
e730: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
e740: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e  f ((ciphers != N
e750: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58  ULL) && !SSL_CTX
e760: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74  _set_cipher_list
e770: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20  (ctx, ciphers)) 
e780: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
e7a0: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a   ciphers failed:
e7b0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
e7c0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
e7d0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
e7e0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
e7f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
e800: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65  if ((ciphersuite
e810: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
e820: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
e830: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70  rsuites(ctx, cip
e840: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54  hersuites)) {..T
e850: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e860: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
e870: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65  her suites faile
e880: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
e890: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
e8a0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
e8b0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
e8c0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
e8d0: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69     /* Set securi
e8e0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
e8f0: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26  if (level > -1 &
e900: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09  & level < 6) {..
e910: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72  /* SSL_set_secur
e920: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53  ity_level */..SS
e930: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69  L_CTX_set_securi
e940: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65  ty_level(ctx, le
e950: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  vel);.    }..   
e960: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
e970: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
e980: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e990: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
e9a0: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
e9b0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
e9c0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
e9d0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
e9e0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
e9f0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72  ePtr);..    /* r
ea00: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c  ead a Diffie-Hel
ea10: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lman parameters 
ea20: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65  file, or use the
ea30: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f   built-in one */
ea40: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ea50: 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65  Init(&ds);.#ifde
ea60: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a  f OPENSSL_NO_DH.
ea70: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
ea80: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
ea90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eaa0: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65  terp, "DH parame
eab0: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20  ter support not 
eac0: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61  available", (cha
ead0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
eae0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
eaf0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
eb00: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a    }.#else.    {.
eb10: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48  .DH* dh;..if (DH
eb20: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
eb30: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  {..    BIO *bio;
eb40: 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f  ...    bio = BIO
eb50: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48  _new_file(F2N(DH
eb60: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72  params, &ds), "r
eb70: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69  ");..    if (!bi
eb80: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  o) {...Tcl_DStri
eb90: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54  ngFree(&ds);...T
eba0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ebb0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
ebc0: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
ebd0: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
ebe0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
ebf0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ec00: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
ec10: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68  ..    }...    dh
ec20: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f   = PEM_read_bio_
ec30: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55  DHparams(bio, NU
ec40: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
ec50: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
ec60: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  io);..    Tcl_DS
ec70: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
ec80: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a  .    if (!dh) {.
ec90: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
eca0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
ecb0: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61  d not read DH pa
ecc0: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69  rameters from fi
ecd0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
ece0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ecf0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ed00: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ed10: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
ed20: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29  _tmp_dh(ctx, dh)
ed30: 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64  ;..    DH_free(d
ed40: 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  h);...} else {..
ed50: 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20      /* Use well 
ed60: 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74  known DH paramet
ed70: 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75  ers that have bu
ed80: 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69  ilt-in support i
ed90: 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20  n OpenSSL */..  
eda0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73    if (!SSL_CTX_s
edb0: 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20  et_dh_auto(ctx, 
edc0: 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  1)) {...Tcl_Appe
edd0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ede0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62   "Could not enab
edf0: 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20  le set DH auto: 
ee00: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
ee10: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ee20: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ee30: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ee40: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ee50: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
ee60: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
ee70: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20  certificate */. 
ee80: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f     load_private_
ee90: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20  key = 0;.    if 
eea0: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c  (certfile != NUL
eeb0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
eec0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66  te_key = 1;...if
eed0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
eee0: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63  rtificate_file(c
eef0: 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65  tx, F2N(certfile
ef00: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45  , &ds), SSL_FILE
ef10: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
ef20: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
ef30: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
ef40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ef50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
ef60: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66  le to set certif
ef70: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
ef80: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
ef90: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
efa0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
efb0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
efc0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
efd0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09  eturn NULL;..}..
efe0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
eff0: 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  &ds);..    } els
f000: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
f010: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
f020: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
f030: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
f040: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
f050: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
f060: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
f070: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f080: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f090: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
f0a0: 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45  cate: ",...GET_E
f0b0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
f0c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
f0d0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
f0e0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
f0f0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
f100: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65  else {..certfile
f110: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67   = (char*)X509_g
f120: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f  et_default_cert_
f130: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53  file();...if (SS
f140: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
f150: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
f160: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49  certfile, SSL_FI
f170: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
f180: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54  ) {.#if 0..    T
f190: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f1a0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
f1b0: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63  to use default c
f1c0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
f1d0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
f1e0: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
f1f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f200: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
f210: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f220: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
f230: 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d  .#endif..}.    }
f240: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
f250: 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a   private key */.
f260: 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69      if (load_pri
f270: 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20  vate_key) {..if 
f280: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
f290: 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29   && key == NULL)
f2a0: 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20   {..    keyfile 
f2b0: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a  = certfile;..}..
f2c0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20  .if (keyfile != 
f2d0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20  NULL) {..    /* 
f2e0: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20  get the private 
f2f0: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
f300: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69  ith this certifi
f310: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20  cate */..    if 
f320: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
f330: 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20  ) {...keyfile = 
f340: 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d  certfile;..    }
f350: 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  ...    if (SSL_C
f360: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
f370: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
f380: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  keyfile, &ds), S
f390: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
f3a0: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44   <= 0) {...Tcl_D
f3b0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f3c0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
f3d0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
f3e0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
f3f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
f400: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
f410: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
f420: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
f430: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f440: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
f450: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20   set public key 
f460: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c  file ", keyfile,
f470: 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f   " ",...    GET_
f480: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
f490: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
f4a0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f4b0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
f4c0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
f4d0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f4e0: 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20  s);...} else if 
f4f0: 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (key != NULL) {.
f500: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
f510: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
f520: 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53  ASN1(EVP_PKEY_RS
f530: 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f  A, ctx, key,key_
f540: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f  len) <= 0) {.../
f550: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
f560: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
f570: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
f580: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
f590: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f5a0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
f5b0: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
f5c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f5d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f5e0: 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20   public key: ", 
f5f0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
f600: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f610: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
f620: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
f630: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
f640: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
f650: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
f660: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
f670: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
f680: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
f690: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
f6a0: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
f6b0: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
f6c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f6d0: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
f6e0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
f6f0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
f700: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
f710: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
f720: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
f730: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f740: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
f750: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
f760: 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 65  /* Set to use de
f770: 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61  fault location a
f780: 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74  nd file for Cert
f790: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74  ificate Authorit
f7a0: 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61  y (CA) certifica
f7b0: 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20  tes. The.     * 
f7c0: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20  verify path and 
f7d0: 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65  store can be ove
f7e0: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
f7f0: 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20  SL_CERT_DIR env 
f800: 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 20  var. The verify 
f810: 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20  file can.     * 
f820: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
f830: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49   the SSL_CERT_FI
f840: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20  LE env var. */. 
f850: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
f860: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69  set_default_veri
f870: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b  fy_paths(ctx)) {
f880: 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d  ..abort++;.    }
f890: 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64  ..    /* Overrid
f8a0: 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 65  es for the CA ve
f8b0: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 69  rify path and fi
f8c0: 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20  le */.    {.#if 
f8d0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
f8e0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
f8f0: 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68  000L..if (CApath
f900: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69   != NULL || CAfi
f910: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
f920: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
f930: 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  s1;..    Tcl_DSt
f940: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a  ringInit(&ds1);.
f950: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
f960: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c  TX_load_verify_l
f970: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32  ocations(ctx, F2
f980: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20  N(CAfile, &ds), 
f990: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31  F2N(CApath, &ds1
f9a0: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b  ))) {...abort++;
f9b0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
f9c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f9d0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
f9e0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a  ingFree(&ds1);..
f9f0: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
fa00: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
fa10: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
fa20: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
fa30: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
fa40: 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  /..    /* https:
fa50: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
fa60: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
fa70: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a   */..    /* XXX:
fa80: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
fa90: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
faa0: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
fab0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
fac0: 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
fad0: 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20  lesystem */..   
fae0: 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
faf0: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
fb00: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
fb10: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
fb20: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
fb30: 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
fb40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
fb50: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
fb60: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
fb70: 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
fb80: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
fb90: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23  Free(&ds);..}..#
fba0: 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74 68  else..if (CApath
fbb0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
fbc0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
fbd0: 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74  ad_verify_dir(ct
fbe0: 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26  x, F2N(CApath, &
fbf0: 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b  ds))) {...abort+
fc00: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  +;..    }..    T
fc10: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
fc20: 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66  ds);..}..if (CAf
fc30: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
fc40: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
fc50: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c  _load_verify_fil
fc60: 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  e(ctx, F2N(CAfil
fc70: 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62  e, &ds))) {...ab
fc80: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
fc90: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
fca0: 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f  ee(&ds);...    /
fcb0: 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41  * Set list of CA
fcc0: 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69  s to send to cli
fcd0: 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74  ent when request
fce0: 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72  ing a client cer
fcf0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
fd00: 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
fd10: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
fd20: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
fd30: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
fd40: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
fd50: 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
fd60: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
fd70: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
fd80: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
fd90: 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
fda0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
fdb0: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65  Free(&ds);..}.#e
fdc0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
fdd0: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
fde0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
fe30: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
fe40: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
fe50: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
fe60: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  peer.. *. * Resu
fe70: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
fe80: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
fe90: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
fea0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
feb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
fec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fef0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
ff00: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64  int.StatusObjCmd
ff10: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
ff20: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
ff30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
ff40: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
ff50: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
ff60: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
ff70: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65  tr;.    X509 *pe
ff80: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  er;.    Tcl_Obj 
ff90: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c  *objPtr;.    Tcl
ffa0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
ffb0: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c     char *channel
ffc0: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a  Name, *ciphers;.
ffd0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
ffe0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
fff0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
10000 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c    unsigned int l
10010 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c  en;.    int nid,
10020 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29   res;.    (void)
10030 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
10040 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
10050 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
10060 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 2 || objc >
10070 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33   3 || (objc == 3
10080 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f   && !strcmp(Tcl_
10090 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
100a0 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20  ]), "-local"))) 
100b0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
100c0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
100d0 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63  bjv, "?-local? c
100e0 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
100f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10100 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
10110 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20  hannel Id */.   
10120 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54   channelName = T
10130 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10140 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31  v[(objc == 2 ? 1
10150 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61   : 2)]);.    cha
10160 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
10170 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
10180 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a  elName, &mode);.
10190 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
101a0 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
101b0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
101c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
101d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
101e0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
101f0 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
10200 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
10210 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
10220 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
10230 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
10240 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
10250 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
10260 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
10270 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
10280 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
10290 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
102a0 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
102b0 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
102c0 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  l", (char *) NUL
102d0 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
102e0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
102f0 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
10300 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
10310 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
10320 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
10330 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10340 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
10350 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
10360 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
10370 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  a(chan);..    /*
10380 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65   Get certificate
10390 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c   for peer or sel
103a0 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  f */.    if (obj
103b0 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20  c == 2) {..peer 
103c0 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63  = SSL_get_peer_c
103d0 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
103e0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
103f0 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20   else {..peer = 
10400 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63  SSL_get_certific
10410 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
10420 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  l);.    }.    /*
10430 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66   Get X509 certif
10440 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  icate info */.  
10450 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
10460 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
10470 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
10480 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
10490 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30  == 2) {..    X50
104a0 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20  9_free(peer);.. 
104b0 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a     peer = NULL;.
104c0 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
104d0 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
104e0 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
104f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10500 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
10510 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10520 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10530 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  eername", SSL_ge
10540 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
10550 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
10560 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
10570 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10580 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65   "sbits", SSL_ge
10590 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74  t_cipher_bits(st
105a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c  atePtr->ssl, NUL
105b0 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  L));..    cipher
105c0 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
105d0 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
105e0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41  tr->ssl);.    LA
105f0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10600 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
10610 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29  r", ciphers, -1)
10620 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
10630 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
10640 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
10650 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
10660 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10670 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10680 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09  verifyResult",..
10690 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
106a0 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
106b0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
106c0 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
106d0 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  l)), -1);..    /
106e0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f  * Verify mode */
106f0 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  .    mode = SSL_
10700 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28  get_verify_mode(
10710 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10720 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20      if (mode && 
10730 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
10740 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
10750 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10760 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
10770 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
10780 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
10790 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
107a0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
107b0 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
107c0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
107d0 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
107e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
107f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
10800 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
10810 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
10820 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
10830 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10840 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
10850 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
10860 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10870 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10880 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10890 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
108a0 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
108b0 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
108c0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
108d0 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
108e0 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
108f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10900 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10910 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10920 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
10930 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
10940 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10950 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
10960 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
10970 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10980 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10990 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
109a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
109b0 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
109c0 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
109d0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
109e0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
109f0 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
10a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
10a10 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
10a20 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10a30 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10a40 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
10a50 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
10a60 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
10a70 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
10a80 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
10a90 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
10aa0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10ab0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
10ac0 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
10ad0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
10ae0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
10af0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
10b00 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10b10 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
10b20 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
10b30 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
10b40 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10b50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10b60 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
10b70 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
10b80 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
10b90 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
10ba0 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
10bb0 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
10bc0 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
10bd0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
10be0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
10bf0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10c00 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10c10 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10c20 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
10c30 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10c40 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10c60 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
10c70 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10c80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10c90 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
10ca0 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
10cb0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
10cc0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 64 20 69  ..    /* Added i
10cd0 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 61  n OpenSSL 1.1.1a
10ce0 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
10cf0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
10d00 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20   0x10101000L.   
10d10 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
10d20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
10d30 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
10d40 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
10d50 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10d60 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
10d70 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
10d80 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
10d90 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10da0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
10db0 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
10dc0 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
10dd0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10de0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70  r, "signatureTyp
10df0 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  e", OBJ_nid2ln(n
10e00 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  id), -1);.#endif
10e10 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
10e20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
10e30 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
10e40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
10e50 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e90 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
10ea0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
10eb0 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
10ec0 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
10ed0 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
10ee0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
10ef0 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
10f00 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f50 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
10f60 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
10f70 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
10f80 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
10f90 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10fa0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
10fb0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
10fc0 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
10fd0 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
10fe0 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
10ff0 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20   a mode on */.  
11000 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
11010 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
11020 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
11030 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  et */.    Tcl_Ob
11040 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74  j *objPtr, *list
11050 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  Ptr;.    const S
11060 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e  SL *ssl;.    con
11070 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
11080 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ipher;.    const
11090 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65   SSL_SESSION *se
110a0 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  ssion;.    const
110b0 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20   EVP_MD *md;.   
110c0 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
110d0 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ta;..    if (obj
110e0 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
110f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11100 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
11110 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
11120 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11130 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
11140 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
11150 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
11160 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
11170 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
11180 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
11190 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
111a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
111b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
111c0 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
111d0 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
111e0 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
111f0 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
11200 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
11210 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
11220 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
11230 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
11240 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
11250 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11260 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
11270 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
11280 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20  lName(chan),..  
11290 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53    "\": not a TLS
112a0 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
112b0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f   *) NULL);..Tcl_
112c0 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
112d0 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
112e0 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
112f0 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
11300 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
11310 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11320 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  R;.    }..    ob
11330 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
11340 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
11350 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  .    /* Connecti
11360 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
11370 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
11380 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
11390 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
113a0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
113b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
113c0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
113d0 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74  L) {../* connect
113e0 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41  ion state */..LA
113f0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11400 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65  , objPtr, "state
11410 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  ", SSL_state_str
11420 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
11430 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49  1);.../* Get SNI
11440 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65   requested serve
11450 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45  r name */..LAPPE
11460 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11470 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61  bjPtr, "serverna
11480 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72  me", SSL_get_ser
11490 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
114a0 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
114b0 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09  t_name), -1);...
114c0 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20  /* Get protocol 
114d0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
114e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
114f0 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f  "protocol", SSL_
11500 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29  get_version(ssl)
11510 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65  , -1);.../* Rene
11520 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65  gotiation allowe
11530 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  d */..LAPPEND_BO
11540 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
11550 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f  r, "renegotiatio
11560 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f  n_allowed", SSL_
11570 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67  get_secure_reneg
11580 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74  otiation_support
11590 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a  ((SSL *) ssl));.
115a0 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74  ../* Get securit
115b0 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50  y level */..LAPP
115c0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
115d0 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74  objPtr, "securit
115e0 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65  y_level", SSL_ge
115f0 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
11600 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  (ssl));.../* Ses
11610 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  sion info */..LA
11620 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11630 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
11640 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c  ion_reused", SSL
11650 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28  _session_reused(
11660 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73  ssl));.../* Is s
11670 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c  erver info */..L
11680 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
11690 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
116a0 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f  server", SSL_is_
116b0 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09  server(ssl));...
116c0 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c  /* Is DTLS */..L
116d0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
116e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
116f0 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74  dtls", SSL_is_dt
11700 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a  ls(ssl));.    }.
11710 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69  .    /* Cipher i
11720 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65  nfo */.    ciphe
11730 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  r = SSL_get_curr
11740 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b  ent_cipher(ssl);
11750 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20  .    if (cipher 
11760 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72  != NULL) {..char
11770 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b   buf[BUFSIZ] = {
11780 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61  0};..int bits, a
11790 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69  lg_bits;.../* Ci
117a0 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41  pher name */..LA
117b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
117c0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
117d0 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  r", SSL_CIPHER_g
117e0 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  et_name(cipher),
117f0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e   -1);.../* RFC n
11800 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f  ame of cipher */
11810 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11820 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11830 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53  tandard_name", S
11840 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61  SL_CIPHER_standa
11850 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  rd_name(cipher),
11860 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53   -1);.../* OpenS
11870 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65  SL name of ciphe
11880 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
11890 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
118a0 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22  , "openssl_name"
118b0 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72  , OPENSSL_cipher
118c0 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52  _name(SSL_CIPHER
118d0 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63  _standard_name(c
118e0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09  ipher)), -1);...
118f0 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  /* number of sec
11900 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f  ret bits used fo
11910 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74  r cipher */..bit
11920 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  s = SSL_CIPHER_g
11930 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20  et_bits(cipher, 
11940 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50  &alg_bits);..LAP
11950 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11960 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74   objPtr, "secret
11970 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09  _bits", bits);..
11980 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11990 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67  rp, objPtr, "alg
119a0 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c  orithm_bits", al
119b0 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67  g_bits);../* alg
119c0 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20  _bits is actual 
119d0 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e  key secret bits.
119e0 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64   If use bits and
119f0 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74   secret (algorit
11a00 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c  hm) bits differ,
11a10 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66  ..   the rest of
11a20 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69   the bits are fi
11a30 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69  xed, i.e. for li
11a40 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70  mited export cip
11a50 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29  hers (bits < 56)
11a60 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74   */.../* Indicat
11a70 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53  es which SSL/TLS
11a80 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
11a90 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  n first defined 
11aa0 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  the cipher */..L
11ab0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11ac0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f  p, objPtr, "min_
11ad0 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49  version", SSL_CI
11ae0 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e  PHER_get_version
11af0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
11b00 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a  ./* Cipher NID *
11b10 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11b20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11b30 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61  cipherNID", (cha
11b40 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
11b50 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69  SL_CIPHER_get_ci
11b60 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29  pher_nid(cipher)
11b70 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
11b80 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11b90 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22  Ptr, "digestNID"
11ba0 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11bb0 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11bc0 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63  get_digest_nid(c
11bd0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
11be0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11bf0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45  p, objPtr, "keyE
11c00 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68  xchangeNID", (ch
11c10 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
11c20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b  SSL_CIPHER_get_k
11c30 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  x_nid(cipher)), 
11c40 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
11c50 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11c60 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f  , "authenticatio
11c70 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  nNID", (char *)O
11c80 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
11c90 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69  PHER_get_auth_ni
11ca0 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
11cb0 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75  .../* message au
11cc0 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64  thentication cod
11cd0 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45  e - Cipher is AE
11ce0 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20  AD (e.g. GCM or 
11cf0 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30  ChaCha20/Poly130
11d00 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a  5) or not */../*
11d10 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45   Authenticated E
11d20 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61  ncryption with a
11d30 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28  ssociated data (
11d40 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09  AEAD) check */..
11d50 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
11d60 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
11d70 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53  pher_is_aead", S
11d80 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61  SL_CIPHER_is_aea
11d90 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
11da0 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72   Digest used dur
11db0 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20  ing the SSL/TLS 
11dc0 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75  handshake when u
11dd0 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e  sing the cipher.
11de0 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49   */..md = SSL_CI
11df0 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61  PHER_get_handsha
11e00 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72  ke_digest(cipher
11e10 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11e20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11e30 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73  "handshake_diges
11e40 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f  t", (char *)EVP_
11e50 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29  MD_name(md), -1)
11e60 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53  ;.../* Get OpenS
11e70 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20  SL-specific ID, 
11e80 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09  not IANA ID */..
11e90 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11ea0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
11eb0 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53  her_id", (int) S
11ec0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64  SL_CIPHER_get_id
11ed0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
11ee0 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64  Two-byte ID used
11ef0 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74   in the TLS prot
11f00 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65  ocol of the give
11f10 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  n cipher */..LAP
11f20 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11f30 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
11f40 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53  ol_id", (int) SS
11f50 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f  L_CIPHER_get_pro
11f60 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29  tocol_id(cipher)
11f70 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20  );.../* Textual 
11f80 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
11f90 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66  he cipher */..if
11fa0 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73   (SSL_CIPHER_des
11fb0 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c  cription(cipher,
11fc0 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
11fd0 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  )) != NULL) {.. 
11fe0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
11ff0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12000 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75  description", bu
12010 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d  f, -1);..}.    }
12020 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
12030 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73   info */.    ses
12040 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73  sion = SSL_get_s
12050 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20  ession(ssl);.   
12060 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20   if (session != 
12070 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75  NULL) {..const u
12080 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69  nsigned char *ti
12090 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65  cket;..size_t le
120a0 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  n2;..unsigned in
120b0 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75  t ulen;..const u
120c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
120d0 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f  ssion_id, *proto
120e0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
120f0 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f   buffer[SSL_MAX_
12100 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
12110 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20  H];.../* Report 
12120 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
12130 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
12140 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65  t of the ALPN ne
12150 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53  gotiation */..SS
12160 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61  L_SESSION_get0_a
12170 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73  lpn_selected(ses
12180 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  sion, &proto, &l
12190 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  en2);..LAPPEND_S
121a0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
121b0 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72  r, "alpn", (char
121c0 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
121d0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
121e0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
121f0 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
12200 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
12210 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f  e NPN negotiatio
12220 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  n */.#ifdef USE_
12230 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65  NPN..SSL_get0_ne
12240 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61  xt_proto_negotia
12250 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  ted(ssl, &proto,
12260 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
12270 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12280 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68  jPtr, "npn", (ch
12290 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
122a0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23  l_Size) ulen);.#
122b0 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d  endif.../* Resum
122c0 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a  able session */.
122d0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
122e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
122f0 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53  esumable", SSL_S
12300 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61  ESSION_is_resuma
12310 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  ble(session));..
12320 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72  ./* Session star
12330 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20  t time (seconds 
12340 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a  since epoch) */.
12350 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
12360 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
12370 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f  tart_time", SSL_
12380 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
12390 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
123a0 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d   Timeout value -
123b0 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d   SSL_CTX_get_tim
123c0 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  eout (in seconds
123d0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
123e0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
123f0 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53  r, "timeout", SS
12400 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
12410 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b  meout(session));
12420 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64  .../* Session id
12430 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62   - TLSv1.2 and b
12440 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65  elow only */..se
12450 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
12460 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
12470 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09  ssion, &ulen);..
12480 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
12490 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
124a0 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
124b0 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69  sion_id, (Tcl_Si
124c0 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20  ze) ulen);.../* 
124d0 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20  Session context 
124e0 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
124f0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12500 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73  0_id_context(ses
12510 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
12520 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
12530 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
12540 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c  ession_context",
12550 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63   session_id, (Tc
12560 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a  l_Size) ulen);..
12570 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
12580 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79  et - client only
12590 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e   */..SSL_SESSION
125a0 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
125b0 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
125c0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
125d0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
125e0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
125f0 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c  ticket", ticket,
12600 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12610 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12620 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20  ticket lifetime 
12630 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  hint (in seconds
12640 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
12650 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
12660 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53  r, "lifetime", S
12670 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
12680 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
12690 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  int(session));..
126a0 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64  ./* Ticket app d
126b0 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ata */.#if OPENS
126c0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
126d0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
126e0 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
126f0 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61  0_ticket_appdata
12700 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29  ((SSL_SESSION *)
12710 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65   session, &ticke
12720 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  t, &len2);..LAPP
12730 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12740 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b  p, objPtr, "tick
12750 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69  et_app_data", ti
12760 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
12770 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a   len2);.#endif..
12780 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b  ./* Get master k
12790 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53  ey */..len2 = SS
127a0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61  L_SESSION_get_ma
127b0 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e  ster_key(session
127c0 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41  , buffer, SSL_MA
127d0 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
127e0 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  GTH);..LAPPEND_B
127f0 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
12800 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65  jPtr, "master_ke
12810 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c  y", buffer, (Tcl
12820 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
12830 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
12840 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69  d */..unsigned i
12850 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  nt id = SSL_SESS
12860 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73  ION_get_compress
12870 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c  _id(session);..L
12880 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12890 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
128a0 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20  ression_id", id 
128b0 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20  == 1 ? "zlib" : 
128c0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
128d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
128e0 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
128f0 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
12900 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
12910 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
12920 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
12930 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
12940 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
12950 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
12960 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
12970 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
12980 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
12990 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53  sl);...LAPPEND_S
129a0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
129b0 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  r, "compression"
129c0 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d  , comp ? SSL_COM
129d0 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29  P_get_name(comp)
129e0 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
129f0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12a00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
12a10 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f  pansion", expn ?
12a20 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
12a30 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65  me(expn) : "none
12a40 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c  ", -1);.#else..L
12a50 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12a60 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
12a70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  ression", "none"
12a80 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
12a90 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12aa0 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c  tr, "expansion",
12ab0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
12ac0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
12ad0 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
12ae0 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f  /.    {..long mo
12af0 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  de = SSL_CTX_get
12b00 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
12b10 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
12b20 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a  x);..char *msg;.
12b30 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  ..if (mode & SSL
12b40 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29  _SESS_CACHE_OFF)
12b50 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f   {..    msg = "o
12b60 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  ff";..} else if 
12b70 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
12b80 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b  _CACHE_CLIENT) {
12b90 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69  ..    msg = "cli
12ba0 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ent";..} else if
12bb0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
12bc0 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20  S_CACHE_SERVER) 
12bd0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65  {..    msg = "se
12be0 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69  rver";..} else i
12bf0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
12c00 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b  SS_CACHE_BOTH) {
12c10 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74  ..    msg = "bot
12c20 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  h";..} else {.. 
12c30 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77     msg = "unknow
12c40 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  n";..}..LAPPEND_
12c50 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12c60 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63  tr, "session_cac
12c70 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d  he_mode", msg, -
12c80 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
12c90 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20  * CA List */.   
12ca0 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72   /* IF not a ser
12cb0 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c  ver, same as SSL
12cc0 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69  _get0_peer_CA_li
12cd0 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61  st. If server sa
12ce0 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65  me as SSL_CTX_ge
12cf0 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
12d00 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20   */.    listPtr 
12d10 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
12d20 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53  (0, NULL);.    S
12d30 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
12d40 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20  E) *ca_list;.   
12d50 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20   if ((ca_list = 
12d60 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  SSL_get_client_C
12d70 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20  A_list(ssl)) != 
12d80 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
12d90 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66  ffer[BUFSIZ];..f
12da0 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
12db0 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   < sk_X509_NAME_
12dc0 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b  num(ca_list); i+
12dd0 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e  +) {..    X509_N
12de0 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58  AME *name = sk_X
12df0 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63  509_NAME_value(c
12e00 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20  a_list, i);..   
12e10 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58   if (name) {...X
12e20 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65  509_NAME_oneline
12e30 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42  (name, buffer, B
12e40 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69  UFSIZ);...Tcl_Li
12e50 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
12e60 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
12e70 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12e80 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
12e90 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
12ea0 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f   }.    LAPPEND_O
12eb0 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
12ec0 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73  r, "caList", lis
12ed0 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45  tPtr);.    LAPPE
12ee0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12ef0 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f  bjPtr, "caListCo
12f00 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41  unt", sk_X509_NA
12f10 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29  ME_num(ca_list))
12f20 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
12f30 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12f40 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
12f50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
12f60 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56  --------. *. * V
12fb0 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20  ersionObjCmd -- 
12fc0 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73  return version s
12fd0 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53  tring from OpenS
12fe0 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
12ff0 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
13000 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
13010 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
13020 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13070 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
13080 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28  t.VersionObjCmd(
13090 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
130a0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
130b0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
130c0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
130d0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
130e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
130f0 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  r;.    (void) cl
13100 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76  ientData;.    (v
13110 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28  oid) objc;.    (
13120 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20  void) objv;..   
13130 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
13140 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
13150 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
13160 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
13170 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
13180 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
13190 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
131a0 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
131b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
131c0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13200 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f  ----. *. * MiscO
13210 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f  bjCmd -- misc co
13220 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73  mmands. *. * Res
13230 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
13240 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
13250 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
13260 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
13270 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13280 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
132c0 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28   int.MiscObjCmd(
132d0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
132e0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
132f0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
13300 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
13310 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
13320 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
13330 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
13340 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72   = { "req", "str
13350 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
13360 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
13370 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51   C_REQ, C_STRREQ
13380 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20  , C_DUMMY };.   
13390 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20   Tcl_Size cmd;. 
133a0 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20     int isStr;.  
133b0 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36    char buffer[16
133c0 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29  384];.    (void)
133d0 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
133e0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
133f0 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
13400 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
13410 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13420 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75  rp, 1, objv, "su
13430 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22  bcommand ?args?"
13440 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
13450 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
13460 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
13470 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
13480 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64  objv[1], command
13490 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  s, "command", 0,
134a0 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b   &cmd) != TCL_OK
134b0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
134c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
134d0 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
134e0 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20  r();..    isStr 
134f0 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52  = (cmd == C_STRR
13500 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20  EQ);.    switch 
13510 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20  ((enum command) 
13520 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52  cmd) {..case C_R
13530 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52  EQ:..case C_STRR
13540 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50  EQ: {..    EVP_P
13550 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a  KEY *pkey=NULL;.
13560 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d  .    X509 *cert=
13570 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f  NULL;..    X509_
13580 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b  NAME *name=NULL;
13590 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ..    Tcl_Obj **
135a0 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f  listv;..    Tcl_
135b0 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20  Size listc;..   
135c0 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49   int i;...    BI
135d0 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
135e0 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c     char *k_C="",
135f0 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22  *k_ST="",*k_L=""
13600 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22  ,*k_O="",*k_OU="
13610 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d  ",*k_CN="",*k_Em
13620 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61  ail="";..    cha
13630 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75  r *keyout,*pemou
13640 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74  t,*str;..    int
13650 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d   keysize,serial=
13660 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66  0,days=365;..#if
13670 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
13680 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
13690 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55  0000L..    BIGNU
136a0 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09  M *bne = NULL;..
136b0 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e      RSA *rsa = N
136c0 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ULL;.#else..    
136d0 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74  EVP_PKEY_CTX *ct
136e0 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  x = NULL;.#endif
136f0 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ...    if ((objc
13700 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29  <5) || (objc>6))
13710 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
13720 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13730 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20   objv, "keysize 
13740 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65  keyfile certfile
13750 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74   ?info?");...ret
13760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13770 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
13780 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13790 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
137a0 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20  ], &keysize) != 
137b0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
137c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
137d0 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74     }..    keyout
137e0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
137f0 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65  bjv[3]);..    pe
13800 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  mout=Tcl_GetStri
13810 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20  ng(objv[4]);..  
13820 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09    if (isStr) {..
13830 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13840 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b  rp,keyout,"",0);
13850 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
13860 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30  terp,pemout,"",0
13870 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
13880 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09  if (objc>=6) {..
13890 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
138a0 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
138b0 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69  rp, objv[5], &li
138c0 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
138d0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20  TCL_OK) {...    
138e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
138f0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69  ;...}....if ((li
13900 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09  stc%2) != 0) {..
13910 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
13920 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72  lt(interp,"Infor
13930 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74  mation list must
13940 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65   have even numbe
13950 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
13960 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
13970 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
13980 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69  .}...for (i=0; i
13990 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a  <listc; i+=2) {.
139a0 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65  ..    str=Tcl_Ge
139b0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d  tString(listv[i]
139c0 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72  );...    if (str
139d0 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d  cmp(str,"days")=
139e0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
139f0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13a00 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
13a10 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29  ,&days)!=TCL_OK)
13a20 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
13a30 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
13a40 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13a50 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d  p(str,"serial")=
13a60 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
13a70 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13a80 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
13a90 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f  ,&serial)!=TCL_O
13aa0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
13ab0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
13ac0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
13ad0 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29  cmp(str,"C")==0)
13ae0 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65   {....k_C=Tcl_Ge
13af0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13b00 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13b10 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13b20 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"ST")==0) {....
13b30 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_ST=Tcl_GetStri
13b40 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13b50 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13b60 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29  (strcmp(str,"L")
13b70 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63  ==0) {....k_L=Tc
13b80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13b90 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13ba0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13bb0 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a  (str,"O")==0) {.
13bc0 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74  ...k_O=Tcl_GetSt
13bd0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13be0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13bf0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
13c00 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  U")==0) {....k_O
13c10 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  U=Tcl_GetString(
13c20 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13c30 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13c40 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d  rcmp(str,"CN")==
13c50 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c  0) {....k_CN=Tcl
13c60 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
13c70 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
13c80 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13c90 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29  str,"Email")==0)
13ca0 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63   {....k_Email=Tc
13cb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13cc0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13cd0 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53   else {....Tcl_S
13ce0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13cf0 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74  "Unknown paramet
13d00 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65  er",NULL);....re
13d10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13d20 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
13d30 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
13d40 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
13d50 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
13d60 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29    bne = BN_new()
13d70 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41  ;..    rsa = RSA
13d80 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65  _new();..    pke
13d90 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
13da0 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65  ();..    if (bne
13db0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20   == NULL || rsa 
13dc0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20  == NULL || pkey 
13dd0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73  == NULL || !BN_s
13de0 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f  et_word(bne,RSA_
13df0 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65  F4) ||...!RSA_ge
13e00 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73  nerate_key_ex(rs
13e10 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c  a, keysize, bne,
13e20 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50   NULL) || !EVP_P
13e30 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
13e40 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45  key, rsa)) {...E
13e50 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
13e60 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65  y);.../* RSA_fre
13e70 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79  e(rsa); freed by
13e80 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a   EVP_PKEY_free *
13e90 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  /...BN_free(bne)
13ea0 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65  ;.#else..    pke
13eb0 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28  y = EVP_RSA_gen(
13ec0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b  (unsigned int) k
13ed0 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
13ee0 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
13ef0 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
13f00 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
13f10 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
13f20 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
13f30 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
13f40 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
13f50 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
13f60 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
13f70 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
13f80 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
13f90 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
13fa0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
13fb0 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
13fc0 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
13fd0 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
13fe0 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
13ff0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
14000 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
14010 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
14020 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
14030 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
14040 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
14050 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
14060 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
14070 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
14080 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
14090 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
140a0 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
140b0 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
140c0 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
140d0 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
140e0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
140f0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
14100 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
14110 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
14120 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
14130 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
14140 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
14150 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
14160 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
14170 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
14180 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
14190 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
141a0 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
141b0 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
141c0 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
141d0 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
141e0 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
141f0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
14200 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
14210 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
14220 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
14230 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
14240 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
14250 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
14260 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
14270 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
14280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
14290 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
142a0 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
142b0 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
142c0 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
142d0 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
142e0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
142f0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
14300 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
14310 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
14320 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14330 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73  R;...}....X509_s
14340 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c  et_version(cert,
14350 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47  2);...ASN1_INTEG
14360 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f  ER_set(X509_get_
14370 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72  serialNumber(cer
14380 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35  t),serial);...X5
14390 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
143a0 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72  09_getm_notBefor
143b0 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35  e(cert),0);...X5
143c0 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
143d0 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72  09_getm_notAfter
143e0 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
143f0 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
14400 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
14410 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61  ert,pkey);....na
14420 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a  me=X509_get_subj
14430 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a  ect_name(cert);.
14440 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14450 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14460 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47  me,"C", MBSTRING
14470 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14480 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14490 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  C, -1, -1, 0);..
144a0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
144b0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
144c0 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"ST", MBSTRING_
144d0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
144e0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53  gned char *) k_S
144f0 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  T, -1, -1, 0);..
14500 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14510 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14520 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"L", MBSTRING_A
14530 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14540 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c  ned char *) k_L,
14550 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14560 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14570 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14580 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  O", MBSTRING_ASC
14590 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
145a0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d  d char *) k_O, -
145b0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
145c0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
145d0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55  _by_txt(name,"OU
145e0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
145f0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14600 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d   char *) k_OU, -
14610 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14620 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14630 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e  _by_txt(name,"CN
14640 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14650 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14660 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
14670 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14680 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14690 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
146a0 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
146b0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
146c0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d  ned char *) k_Em
146d0 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  ail, -1, -1, 0);
146e0 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62  ....X509_set_sub
146f0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e  ject_name(cert,n
14700 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35  ame);....if (!X5
14710 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65  09_sign(cert,pke
14720 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29  y,EVP_sha256()))
14730 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72   {...    X509_fr
14740 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ee(cert);...    
14750 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14760 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
14770 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
14780 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
14790 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
147a0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54  ;.#endif...    T
147b0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
147c0 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69  erp,"Error signi
147d0 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c  ng certificate",
147e0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
147f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
14800 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29  .}....if (isStr)
14810 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
14820 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
14830 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
14840 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
14850 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42  cert);...    i=B
14860 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
14870 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
14880 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
14890 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
148a0 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
148b0 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
148c0 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
148d0 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
148e0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
148f0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
14900 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
14910 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
14920 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
14930 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
14940 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
14950 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,pemout);...    
14960 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
14970 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
14980 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
14990 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  (out);...}....X5
149a0 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
149b0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
149c0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
149d0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
149e0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
149f0 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
14a00 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a  endif..    }..}.
14a10 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
14a20 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
14a30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
14a40 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a  L_OK;.}.../*****
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14a60 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20  ./* Init        
14a70 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
14a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
14a90 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ad0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
14ae0 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a  ls_Free --. *. *
14af0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
14b00 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
14b10 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
14b20 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
14b30 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
14b40 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
14b50 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a  alls below 1. *.
14b60 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e   * Results:. *.n
14b70 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
14b80 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73  ffects:. *.Frees
14b90 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20   all the state. 
14ba0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
14bf0 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72  .Tls_Free(tls_fr
14c00 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74  ee_type *blockPt
14c10 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  r) {.    State *
14c20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
14c30 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20  e *)blockPtr;.. 
14c40 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14c50 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43  ed");..    Tls_C
14c60 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a  lean(statePtr);.
14c70 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b      ckfree(block
14c80 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cd0 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65  --. *. * Tls_Cle
14ce0 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  an --. *. *.This
14cf0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
14d00 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
14d10 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
14d20 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
14d30 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
14d40 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
14d50 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73  below 1.  This s
14d60 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c  hould. *.be call
14d70 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  ed synchronously
14d80 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f   by the ClosePro
14d90 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a  c, not in the. *
14da0 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  .EventuallyFree 
14db0 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20  callback.. *. * 
14dc0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
14dd0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
14de0 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
14df0 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
14e00 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e40 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c  ----. */.void Tl
14e50 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73  s_Clean(State *s
14e60 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64  tatePtr) {.    d
14e70 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14e80 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
14e90 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
14ea0 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20  here that we're 
14eb0 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a  single-threaded.
14ec0 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
14ed0 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
14ee0 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
14ef0 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
14f00 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
14f10 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
14f20 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
14f30 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20  >timer = NULL;. 
14f40 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
14f50 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20  atePtr->protos) 
14f60 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50  {..ckfree(stateP
14f70 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74  tr->protos);..st
14f80 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
14f90 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14fa0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62   if (statePtr->b
14fb0 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77  io) {../* This w
14fc0 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75  ill call SSL_shu
14fd0 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30  tdown. Bug 14140
14fe0 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22  45 */..dprintf("
14ff0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29  BIO_free_all(%p)
15000 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ", statePtr->bio
15010 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  );..BIO_free_all
15020 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
15030 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20  ..statePtr->bio 
15040 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
15050 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
15060 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ssl) {..dprintf(
15070 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20  "SSL_free(%p)", 
15080 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
15090 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50  .SSL_free(stateP
150a0 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65  tr->ssl);..state
150b0 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b  Ptr->ssl = NULL;
150c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
150d0 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a  tatePtr->ctx) {.
150e0 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74  .SSL_CTX_free(st
150f0 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73  atePtr->ctx);..s
15100 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e  tatePtr->ctx = N
15110 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
15120 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
15130 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65  lback) {..Tcl_De
15140 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
15150 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
15160 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  .statePtr->callb
15170 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ack = NULL;.    
15180 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15190 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a  tr->password) {.
151a0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
151b0 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
151c0 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72  word);..statePtr
151d0 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c  ->password = NUL
151e0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
151f0 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
15200 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
15210 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
15220 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  cmd);..statePtr-
15230 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >vcmd = NULL;.  
15240 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
15250 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d  ("Returning");.}
15260 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
15270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
152b0 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20  *. * Build Info 
152c0 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a  Command --. *. *
152d0 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20  .Create command 
152e0 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20  to return build 
152f0 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65  info for package
15300 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
15310 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
15320 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20  cl result. *. * 
15330 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
15340 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69  .Created build-i
15350 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a  nfo command.. *.
15360 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69  --------. */..#i
153b0 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a  fndef STRINGIFY.
153c0 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47  #  define STRING
153d0 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 59  IFY(x) STRINGIFY
153e0 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53  1(x).#  define S
153f0 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a  TRINGIFY1(x) #x.
15400 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c  #endif..int.Buil
15410 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c  dInfoCommand(Tcl
15420 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29  _Interp* interp)
15430 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e   {.    Tcl_CmdIn
15440 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66  fo info;..    if
15450 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   (Tcl_GetCommand
15460 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a  Info(interp, "::
15470 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22  tcl::build-info"
15480 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c  , &info)) {..Tcl
15490 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
154a0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
154b0 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69  ::build-info", i
154c0 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f  nfo.objProc, (vo
154d0 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45  id *)(...PACKAGE
154e0 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52  _VERSION "+" STR
154f0 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49  INGIFY(TLS_VERSI
15500 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66  ON_UUID).#if def
15510 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20  ined(__clang__) 
15520 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  && defined(__cla
15530 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20  ng_major__).... 
15540 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52     ".clang-" STR
15550 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d  INGIFY(__clang_m
15560 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c  ajor__).#if __cl
15570 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30  ang_minor__ < 10
15580 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64  ....    "0".#end
15590 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47  if....    STRING
155a0 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f  IFY(__clang_mino
155b0 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20  r__).#endif.#if 
155c0 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70  defined(__cplusp
155d0 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e 65 64  lus) && !defined
155e0 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20  (__OBJC__)....  
155f0 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23    ".cplusplus".#
15600 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44  endif.#ifndef ND
15610 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65  EBUG....    ".de
15620 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20  bug".#endif.#if 
15630 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67  !defined(__clang
15640 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
15650 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52  __INTEL_COMPILER
15660 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47  ) && defined(__G
15670 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e  NUC__)....    ".
15680 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28  gcc-" STRINGIFY(
15690 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f  __GNUC__).#if __
156a0 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31  GNUC_MINOR__ < 1
156b0 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e  0....    "0".#en
156c0 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e  dif....    STRIN
156d0 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f  GIFY(__GNUC_MINO
156e0 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  R__).#endif.#ifd
156f0 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  ef __INTEL_COMPI
15700 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63  LER....    ".icc
15710 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49  -" STRINGIFY(__I
15720 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23  NTEL_COMPILER).#
15730 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c  endif.#ifdef TCL
15740 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20  _MEM_DEBUG....  
15750 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65    ".memdebug".#e
15760 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
15770 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20  (_MSC_VER)....  
15780 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e    ".msvc-" STRIN
15790 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23  GIFY(_MSC_VER).#
157a0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53 45  endif.#ifdef USE
157b0 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e  _NMAKE....    ".
157c0 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69  nmake".#endif.#i
157d0 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50  fndef TCL_CFG_OP
157e0 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22  TIMIZED....    "
157f0 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65  .no-optimize".#e
15800 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42  ndif.#ifdef __OB
15810 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62  JC__....    ".ob
15820 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64  jective-c".#if d
15830 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c  efined(__cpluspl
15840 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73  us)....    "plus
15850 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e  plus".#endif.#en
15860 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43  dif.#ifdef TCL_C
15870 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20  FG_PROFILED.... 
15880 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65     ".profile".#e
15890 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 52 49  ndif.#ifdef PURI
158a0 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69  FY....    ".puri
158b0 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  fy".#endif.#ifde
158c0 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09  f STATIC_BUILD..
158d0 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a  ..    ".static".
158e0 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c  #endif...), NULL
158f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
15900 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
15910 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
15960 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  ls_Init --. *. *
15970 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61  .This is a packa
15980 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ge initializatio
15990 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69  n procedure, whi
159a0 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  ch is called. *.
159b0 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73  by Tcl when this
159c0 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62   package is to b
159d0 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e  e added to an in
159e0 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a  terpreter.. *. *
159f0 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63   Results:  Ssl c
15a00 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f  onfigured and lo
15a10 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20  aded. *. * Side 
15a20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65  effects:. *. cre
15a30 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d  ate the ssl comm
15a40 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20  and, initialize 
15a50 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20  ssl context. *. 
15a60 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15aa0 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43  ----. */..#if TC
15ab0 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
15ac0 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  > 8.#define MIN_
15ad0 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65  VERSION "9.0".#e
15ae0 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f  lse.#define MIN_
15af0 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65  VERSION "8.5".#e
15b00 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e  ndif..static con
15b10 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e  st char tlsTclIn
15b20 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23  itScript[] = {.#
15b30 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c  include "tls.tcl
15b40 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b  .h"..0x00.    };
15b50 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  ..DLLEXPORT int 
15b60 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Tls_Init(Tcl_Int
15b70 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a  erp *interp) {..
15b80 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
15b90 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55  led");..#ifdef U
15ba0 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20  SE_TCL_STUBS.   
15bb0 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75   if (Tcl_InitStu
15bc0 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56  bs(interp, MIN_V
15bd0 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55  ERSION, 0) == NU
15be0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
15bf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
15c00 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63  endif.    if (Tc
15c10 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
15c20 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f  erp, "Tcl", MIN_
15c30 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e  VERSION, 0) == N
15c40 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
15c50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15c60 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
15c70 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  nit(0) != TCL_OK
15c80 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
15c90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
15ca0 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
15cb0 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
15cc0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
15cd0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
15ce0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
15cf0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15d00 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
15d10 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43  tls::ciphers", C
15d20 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43  iphersObjCmd, (C
15d30 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15d40 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15d50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15d60 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15d70 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15d80 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ::tls::connectio
15d90 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
15da0 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  foObjCmd, (Clien
15db0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
15dc0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15dd0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15de0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15df0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
15e00 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48  s::handshake", H
15e10 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20  andshakeObjCmd, 
15e20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15e30 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15e40 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15e50 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15e60 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15e70 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22   "::tls::import"
15e80 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20  , ImportObjCmd, 
15e90 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15ea0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15eb0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15ec0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15ed0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15ee0 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72   "::tls::unimpor
15ef0 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  t", UnimportObjC
15f00 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15f10 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
15f20 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15f30 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15f40 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15f50 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61  erp, "::tls::sta
15f60 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43  tus", StatusObjC
15f70 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15f80 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
15f90 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15fa0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15fb0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15fc0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72  erp, "::tls::ver
15fd0 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62  sion", VersionOb
15fe0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15ff0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
16000 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
16010 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
16020 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
16030 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d  nterp, "::tls::m
16040 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64  isc", MiscObjCmd
16050 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
16060 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
16070 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
16080 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
16090 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
160a0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f  p, "::tls::proto
160b0 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73  cols", Protocols
160c0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
160d0 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
160e0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
160f0 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69   NULL);..    Bui
16100 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e  ldInfoCommand(in
16110 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28  terp);..    if (
16120 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76  interp && Tcl_Ev
16130 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63  al(interp, tlsTc
16140 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20  lInitScript) != 
16150 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
16160 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16170 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
16180 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
16190 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41  terp, PACKAGE_NA
161a0 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ME, PACKAGE_VERS
161b0 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ION);.}../*. *--
161c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161f0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f  ----*. *. *.Tls_
16200 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  SafeInit --. *. 
16210 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
16220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16240 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20  --*. *.Standard 
16250 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72  procedure requir
16260 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a  ed by 'load'.. *
16270 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69  .Initializes thi
16280 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20  s extension for 
16290 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  a safe interpret
162a0 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  er.. *.---------
162b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162d0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
162e0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
162f0 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74  .As of 'Tls_Init
16300 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  '. *. *.Result:.
16310 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54   *..A standard T
16320 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  cl error code.. 
16330 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
16370 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
16380 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  s_SafeInit(Tcl_I
16390 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
163a0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
163b0 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  lled");.    retu
163c0 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65  rn Tls_Init(inte
163d0 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  rp);.}../*. *---
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16410 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69  ---*. *. *.TlsLi
16420 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  bInit --. *. *.-
16430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16460 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
16470 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65  SSL library once
16480 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   per application
16490 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
164a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164c0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
164d0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e   effects:. *..in
164e0 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
164f0 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75  brary. *. *.Resu
16500 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a  lt:. *..none. *.
16510 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
16550 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
16560 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
16570 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74  lize) {.    stat
16580 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
16590 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
165a0 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
165b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
165c0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
165d0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
165e0 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74  EADS).    size_t
165f0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64   num_locks;.#end
16600 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e  if..    if (unin
16610 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20  itialize) {..if 
16620 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
16630 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41  ..    dprintf("A
16640 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
16650 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65  lize, but we are
16660 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
16670 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e  ");...    return
16680 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70   TCL_OK;..}...dp
16690 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
166a0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a  uninitialize");.
166b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
166c0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
166d0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
166e0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
166f0 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  Lock(&init_mx);.
16700 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09  ..if (locks) {..
16710 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
16720 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55  ..    locks = NU
16730 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f  LL;..    locksCo
16740 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64  unt = 0;..}.#end
16750 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20  if..initialized 
16760 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 0;..#if define
16770 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
16780 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
16790 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
167a0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
167b0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  t_mx);.#endif...
167c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
167d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e     }..    if (in
167e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70  itialized) {..dp
167f0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62  rintf("Called, b
16800 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20  ut using cached 
16810 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e  value");..return
16820 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a   status;.    }..
16830 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
16840 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
16850 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16860 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16870 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
16880 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26   Tcl_MutexLock(&
16890 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
168a0 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
168b0 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 1;..#if defin
168c0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
168d0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
168e0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
168f0 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20  num_locks = 1;. 
16900 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
16910 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
16920 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
16930 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
16940 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
16950 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
16960 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
16970 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
16980 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
16990 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
169a0 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
169b0 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
169c0 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
169d0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
169e0 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
169f0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
16a00 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
16a10 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
16a20 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
16a30 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
16a40 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
16a50 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f   NULL);..    BIO
16a60 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
16a70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
16a80 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
16a90 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
16aa0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
16ab0 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
16ac0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  mx);.#endif..   
16ad0 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a   return status;.
16ae0 7d 0a                                            }.