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 3b 20     char *major; 
1090: 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20  char *minor;..  
10a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
10b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
10c0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
10d0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
10e0: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
10f0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
1100: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53  L_CB_HANDSHAKE_S
1110: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  TART) {..major =
1120: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1130: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a  inor = "start";.
1140: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77      } else if (w
1150: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41  here & SSL_CB_HA
1160: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a  NDSHAKE_DONE) {.
1170: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1180: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1190: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73  done";.    } els
11a0: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26  e {..if (where &
11b0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09   SSL_CB_ALERT)..
11c0: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b  major = "alert";
11d0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
11e0: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43   & SSL_ST_CONNEC
11f0: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e  T).major = "conn
1200: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ect";..else if (
1210: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41  where & SSL_ST_A
1220: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20  CCEPT)..major = 
1230: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09  "accept";..else.
1240: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b  ....major = "unk
1250: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65  nown";...if (whe
1260: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44  re & SSL_CB_READ
1270: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64  )..minor = "read
1280: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1290: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54  re & SSL_CB_WRIT
12a0: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69  E)..minor = "wri
12b0: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  te";..else if (w
12c0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f  here & SSL_CB_LO
12d0: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f  OP)..minor = "lo
12e0: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  op";..else if (w
12f0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58  here & SSL_CB_EX
1300: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78  IT)..minor = "ex
1310: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  it";..else.....m
1320: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  inor = "unknown"
1330: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1340: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1350: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1360: 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e  chan, major, min
1370: 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64  or, message, and
1380: 20 74 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20   type args */.  
1390: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
13a0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
13b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
13c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1400: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
1410: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1420: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1430: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1440: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1450: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1460: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1470: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1480: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1490: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
14a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
14b0: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
14c0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1500: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
1510: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
1520: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1530: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1540: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1550: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1570: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1580: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1590: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
15a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
15b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
15c0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15d0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15e0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15f0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
1600: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
1610: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1620: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1630: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1640: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1650: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1660: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1670: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1680: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1690: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
16a0: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
16b0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
16c0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16d0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16e0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16f0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
1700: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
1710: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
1720: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1730: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1740: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
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 2d 2d 2d  ----------------
1790: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
17a0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
17b0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
17c0: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17e0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
1800: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
1810: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
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 2d 2d  ----------------
1860: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1870: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1880: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1890: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
18a0: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
18b0: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
18c0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18d0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18e0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18f0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
1900: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
1910: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
1920: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1930: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1940: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1950: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1960: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1970: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1980: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1990: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
19a0: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
19b0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
19c0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19d0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19e0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19f0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
1a00: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
1a10: 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66 20 4f 50  ersion) {.#if OP
1a20: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1a30: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
1a40: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
1a50: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
1a60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
1a70: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 53 53  SL2).    case SS
1a80: 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  L2_VERSION:..ver
1a90: 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09 62 72 65   = "SSLv2";..bre
1aa0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
1ab0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
1ac0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1ad0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 56 45 52 53    case SSL3_VERS
1af0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1b00: 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v3";..break;.#en
1b10: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
1b20: 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  1_VERSION:..ver 
1b30: 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62 72 65 61  = "TLSv1";..brea
1b40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31  k;.    case TLS1
1b50: 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72  _1_VERSION:..ver
1b60: 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b 0a 09 62   = "TLSv1.1";..b
1b70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b80: 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_2_VERSION:..
1b90: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 32 22 3b  ver = "TLSv1.2";
1ba0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1bb0: 65 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  e TLS1_3_VERSION
1bc0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1bd0: 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  3";..break;.    
1be0: 63 61 73 65 20 30 3a 0a 09 76 65 72 20 3d 20 22  case 0:..ver = "
1bf0: 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  none";..break;. 
1c00: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 76 65 72     default:..ver
1c10: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62   = "unknown";..b
1c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c30: 20 73 77 69 74 63 68 20 28 63 6f 6e 74 65 6e 74   switch (content
1c40: 5f 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73  _type) {.    cas
1c50: 65 20 53 53 4c 33 5f 52 54 5f 48 45 41 44 45 52  e SSL3_RT_HEADER
1c60: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 64 65  :..type = "Heade
1c70: 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  r";..break;.    
1c80: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 49 4e 4e  case SSL3_RT_INN
1c90: 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59 50 45 3a  ER_CONTENT_TYPE:
1ca0: 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e 65 72 20  ..type = "Inner 
1cb0: 43 6f 6e 74 65 6e 74 20 54 79 70 65 22 3b 0a 09  Content Type";..
1cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cd0: 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47 45 5f 43  SSL3_RT_CHANGE_C
1ce0: 49 50 48 45 52 5f 53 50 45 43 3a 0a 09 74 79 70  IPHER_SPEC:..typ
1cf0: 65 20 3d 20 22 43 68 61 6e 67 65 20 43 69 70 68  e = "Change Ciph
1d00: 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  er";..break;.   
1d10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 4c   case SSL3_RT_AL
1d20: 45 52 54 3a 0a 09 74 79 70 65 20 3d 20 22 41 6c  ERT:..type = "Al
1d30: 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ert";..break;.  
1d40: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48    case SSL3_RT_H
1d50: 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79 70 65 20  ANDSHAKE:..type 
1d60: 3d 20 22 48 61 6e 64 73 68 61 6b 65 22 3b 0a 09  = "Handshake";..
1d70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d80: 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49 43 41 54  SSL3_RT_APPLICAT
1d90: 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79 70 65 20  ION_DATA:..type 
1da0: 3d 20 22 41 70 70 20 44 61 74 61 22 3b 0a 09 62  = "App Data";..b
1db0: 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45 4e 53 53  reak;.#if OPENSS
1dc0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
1dd0: 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 20   < 0x30000000L. 
1de0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1df0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1e00: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1e10: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1e20: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 74 79      default:..ty
1e30: 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  pe = "unknown";.
1e40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65      }..    /* Ne
1e50: 65 64 73 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  eds compile time
1e60: 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62 6c 65 2d   option "enable-
1e70: 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a 2f 0a 20  ssl-trace". */. 
1e80: 20 20 20 69 66 20 28 28 62 69 6f 20 3d 20 42 49     if ((bio = BI
1e90: 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
1ea0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
1eb0: 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74 72 61 63  int n;..SSL_trac
1ec0: 65 28 77 72 69 74 65 5f 70 2c 20 76 65 72 73 69  e(write_p, versi
1ed0: 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65  on, content_type
1ee0: 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c  , buf, len, ssl,
1ef0: 20 28 76 6f 69 64 20 2a 29 62 69 6f 29 3b 0a 09   (void *)bio);..
1f00: 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28 62 69 6f  n = BIO_read(bio
1f10: 2c 20 62 75 66 66 65 72 2c 20 42 49 4f 5f 70 65  , buffer, BIO_pe
1f20: 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20 31 35 30  nding(bio) < 150
1f30: 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64 69 6e 67  00 ? BIO_pending
1f40: 28 62 69 6f 29 20 3a 20 31 34 39 39 39 29 3b 0a  (bio) : 14999);.
1f50: 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 20 3a  .n = (n<0) ? 0 :
1f60: 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d 20 3d   n;..buffer[n] =
1f70: 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f 5f 66   0;..(void)BIO_f
1f80: 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 4f 5f  lush(bio);..BIO_
1f90: 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 7d 0a  free(bio);.   }.
1fa0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
1fb0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
1fc0: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 69  ith fn, chan, di
1fd0: 72 65 63 74 69 6f 6e 2c 20 76 65 72 73 69 6f 6e  rection, version
1fe0: 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d 65 73 73  , type, and mess
1ff0: 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  age args */.    
2000: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
2010: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
2020: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
2030: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2040: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2050: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2060: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 65  NewStringObj("me
2070: 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a 20 20  ssage", -1));.  
2080: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2090: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
20a0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
20b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20c0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
20d0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
20e0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
20f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2100: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2110: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
2120: 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65 5f 70  tringObj(write_p
2130: 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52 65 63   ? "Sent" : "Rec
2140: 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20  eived", -1));.  
2150: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2160: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2170: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2180: 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65 72 2c  ewStringObj(ver,
2190: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
21a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
21b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
21c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
21d0: 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29 29 3b  gObj(type, -1));
21e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
21f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2200: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2210: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
2220: 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  uffer, -1));..  
2230: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
2240: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
2250: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2260: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
2270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2290: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
22a0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
22b0: 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  Ptr);.}.#endif..
22c0: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2310: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 20 2d  VerifyCallback -
2320: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
2330: 20 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65   SSL certificate
2340: 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72 6f 63   validation proc
2350: 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63 6f 6e  ess. Used to con
2360: 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65 68 61  trol the. *.beha
2370: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20 53 53  vior when the SS
2380: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20 66 6c  L_VERIFY_PEER fl
2390: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
23a0: 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77 68 65  is called. *.whe
23b0: 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69 63  never a certific
23c0: 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65 64  ate is inspected
23d0: 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e 76 61   or decided inva
23e0: 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f 72 0a  lid. Called for.
23f0: 20 2a 09 65 61 63 68 20 63 65 72 74 69 66 69 63   *.each certific
2400: 61 74 65 20 69 6e 20 74 68 65 20 63 65 72 74 20  ate in the cert 
2410: 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65  chain.. *. * Che
2420: 63 6b 73 3a 0a 20 2a 09 54 68 65 20 63 65 72 74  cks:. *.The cert
2430: 69 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73  ificate chain is
2440: 20 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e   checked startin
2450: 67 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65  g with the deepe
2460: 73 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c  st nesting level
2470: 0a 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20  . *.  (the root 
2480: 43 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20  CA certificate) 
2490: 61 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72  and worked upwar
24a0: 64 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20  d to the peer's 
24b0: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09  certificate.. *.
24c0: 41 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61  All signatures a
24d0: 72 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e  re valid, curren
24e0: 74 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e  t time is within
24f0: 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20   first and last 
2500: 76 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20  validity time.. 
2510: 2a 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  *.Check that the
2520: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
2530: 69 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73  issued by the is
2540: 73 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65  suer certificate
2550: 20 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63   issuer.. *.Chec
2560: 6b 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e  k the revocation
2570: 20 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68   status for each
2580: 20 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a   certificate.. *
2590: 09 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64  .Check the valid
25a0: 69 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ity of the given
25b0: 20 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72   CRL and the cer
25c0: 74 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61  t revocation sta
25d0: 74 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  tus.. *.Check th
25e0: 65 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c  e policies of al
25f0: 6c 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  l the certificat
2600: 65 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a  es. *. * Args. *
2610: 09 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e  .preverify_ok in
2620: 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20  dicates whether 
2630: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
2640: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73  verification pas
2650: 73 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28  sed (1) or not (
2660: 30 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  0). *. * Results
2670: 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20  :. *.A callback 
2680: 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63  bound to the soc
2690: 6b 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f  ket may return o
26a0: 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09  ne of:. *.    0.
26b0: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63  ..- the certific
26c0: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e  ate is deemed in
26d0: 76 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69  valid, send veri
26e0: 66 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20  fication. *.... 
26f0: 20 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74   failure alert t
2700: 6f 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d  o peer, and term
2710: 69 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e  inate handshake.
2720: 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68  . *.    1...- th
2730: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  e certificate is
2740: 20 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63   deemed valid, c
2750: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e  ontinue with han
2760: 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65  dshake.. *.    e
2770: 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f  mpty string.- no
2780: 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69   change to certi
2790: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
27a0: 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  n. *. * Side eff
27b0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72  ects:. *.The err
27c0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
27d0: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76  rrently operativ
27e0: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20  e State is set. 
27f0: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20  *.  to a string 
2800: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53  describing the S
2810: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66  SL negotiation f
2820: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a  ailure reason. *
2830: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
2880: 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c  c int.VerifyCall
2890: 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30  back(int ok, X50
28a0: 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78  9_STORE_CTX *ctx
28b0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
28c0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c  *cmdPtr;.    SSL
28d0: 20 20 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a     *ssl..= (SSL*
28e0: 29 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f  )X509_STORE_CTX_
28f0: 67 65 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c  get_ex_data(ctx,
2900: 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61   SSL_get_ex_data
2910: 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f  _X509_STORE_CTX_
2920: 69 64 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39  idx());.    X509
2930: 20 20 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f    *cert..= X509_
2940: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75  STORE_CTX_get_cu
2950: 72 72 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b  rrent_cert(ctx);
2960: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
2970: 65 50 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53  ePtr.= (State*)S
2980: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
2990: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ssl);.    Tcl_In
29a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
29b0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
29c0: 0a 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09  .    int depth..
29d0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
29e0: 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68  _get_error_depth
29f0: 28 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65  (ctx);.    int e
2a00: 72 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  rr..= X509_STORE
2a10: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63  _CTX_get_error(c
2a20: 74 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  tx);..    dprint
2a30: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
2a40: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2a50: 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f  Callback: %d", o
2a60: 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  k);..    if (sta
2a70: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
2a80: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
2a90: 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75  ../* Use ok valu
2aa0: 65 20 69 66 20 76 65 72 69 66 69 63 61 74 69 6f  e if verificatio
2ab0: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  n is required */
2ac0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
2ad0: 76 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52  vflags & SSL_VER
2ae0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
2af0: 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
2b00: 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65   return ok;..} e
2b10: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72  lse {..    retur
2b20: 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  n 1;..}.    } el
2b30: 73 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e  se if (cert == N
2b40: 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55  ULL || ssl == NU
2b50: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b  LL) {..return 0;
2b60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
2b70: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62  ntf("VerifyCallb
2b80: 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61  ack: eval callba
2b90: 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  ck");..    /* Cr
2ba0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
2bb0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
2bc0: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20  an, depth, cert 
2bd0: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75  info list, statu
2be0: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67  s, and error arg
2bf0: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
2c00: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2c10: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
2c20: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
2c30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c60: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  j("verify", -1))
2c70: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2c80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2c90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2ca0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2cb0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2cc0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2cd0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
2ce0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2cf0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2d00: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2d10: 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20  ntObj(depth));. 
2d20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2d30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f  rp, cmdPtr, Tls_
2d50: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
2d60: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54  p, cert));.    T
2d70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2d80: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2d90: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  cmdPtr, Tcl_NewI
2da0: 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20  ntObj(ok));.    
2db0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2dc0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2dd0: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2de0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
2df0: 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  *)X509_verify_ce
2e00: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
2e10: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  err), -1));..   
2e20: 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20   /* Prevent I/O 
2e30: 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69  while callback i
2e40: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f  s in progress */
2e50: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2e60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54  ->flags |= TLS_T
2e70: 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a  CL_CALLBACK; */.
2e80: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
2e90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
2ea0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
2eb0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
2ec0: 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c     ok = EvalCall
2ed0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2ee0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2ef0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2f00: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
2f10: 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69     dprintf("Veri
2f20: 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d  fyCallback: comm
2f30: 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22  and result = %d"
2f40: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73  , ok);..    /* s
2f50: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2f60: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  = ~(TLS_TCL_CALL
2f70: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  BACK); */.    re
2f80: 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64  turn ok;./* By d
2f90: 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65  efault, leave ve
2fa0: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61  rification uncha
2fb0: 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a  nged. */.}.../*.
2fc0: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
3010: 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43  Error --. *. *.C
3020: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  alls callback wi
3030: 74 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  th error message
3040: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
3050: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72  ects:. *.The err
3060: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
3070: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76  rrently operativ
3080: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20  e State is set. 
3090: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20  *.  to a string 
30a0: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53  describing the S
30b0: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66  SL negotiation f
30c0: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a  ailure reason. *
30d0: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
3120: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
3130: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20  *statePtr, char 
3140: 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *msg) {.    Tcl_
3150: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
3160: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
3170: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
3180: 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72  cmdPtr, *listPtr
3190: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  ;.    unsigned l
31a0: 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61  ong err;.    sta
31b0: 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67  tePtr->err = msg
31c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
31d0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
31e0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
31f0: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
3200: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  j*)NULL)..return
3210: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
3220: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
3230: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
3240: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
3250: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
3260: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
3270: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
3280: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
3290: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
32a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
32b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
32c0: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31  gObj("error", -1
32d0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
32e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
32f0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3300: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
3310: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
3320: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
3330: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
3340: 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d 20  .    if (msg != 
3350: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  NULL) {..Tcl_Lis
3360: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3370: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3380: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3390: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20  bj(msg, -1));.. 
33a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 6d     } else if ((m
33b0: 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sg = Tcl_GetStri
33c0: 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  ng(Tcl_GetObjRes
33d0: 75 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21 3d  ult(interp))) !=
33e0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69   NULL) {..Tcl_Li
33f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3400: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3410: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3420: 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a  Obj(msg, -1));..
3430: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69      } else {..li
3440: 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
3450: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
3460: 0a 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20  ..while ((err = 
3470: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29  ERR_get_error())
3480: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   != 0) {..    Tc
3490: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
34a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
34b0: 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  istPtr, Tcl_NewS
34c0: 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61  tringObj(ERR_rea
34d0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  son_error_string
34e0: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a  (err), -1));..}.
34f0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
3500: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3510: 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74  , cmdPtr, listPt
3520: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
3530: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
3540: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
3550: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
3560: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
3570: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
3580: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
3590: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
35a0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
35b0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a  ---------------.
3600: 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c   *. * KeyLogCall
3610: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72  back --. *. *.Wr
3620: 69 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79  ite received key
3630: 20 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c   data to log fil
3640: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
3650: 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  fects:. *.none. 
3660: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
36b0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28   KeyLogCallback(
36c0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
36d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65  const char *line
36e0: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74  ) {.    char *st
36f0: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45  r = getenv(SSLKE
3700: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46  YLOGFILE);.    F
3710: 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70  ILE *fd;..    dp
3720: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
3730: 0a 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b  ..    if (str) {
3740: 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72  ..fd = fopen(str
3750: 2c 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66  , "a");..fprintf
3760: 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65  (fd, "%s\n",line
3770: 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a  );..fclose(fd);.
3780: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d  ----------------
37d0: 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72  --. *. * Passwor
37e0: 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  d Callback --. *
37f0: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20  . *.Called when 
3800: 61 20 70 61 73 73 77 6f 72 64 20 69 73 20 6e 65  a password is ne
3810: 65 64 65 64 20 66 6f 72 20 61 20 70 72 69 76 61  eded for a priva
3820: 74 65 20 6b 65 79 20 77 68 65 6e 20 6c 6f 61 64  te key when load
3830: 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f 72 69 6e  ing. *.or storin
3840: 67 20 61 20 50 45 4d 20 63 65 72 74 69 66 69 63  g a PEM certific
3850: 61 74 65 20 77 69 74 68 20 65 6e 63 72 79 70 74  ate with encrypt
3860: 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62  ion. Evals callb
3870: 61 63 6b 0a 20 2a 09 73 63 72 69 70 74 20 61 6e  ack. *.script an
3880: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65  d returns the re
3890: 73 75 6c 74 20 61 73 20 74 68 65 20 70 61 73 73  sult as the pass
38a0: 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e 20 62  word string in b
38b0: 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  uf.. *. * Result
38c0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
38d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
38e0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
38f0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
3900: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
3910: 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20 69 6e  Password size in
3920: 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66 6f 72   bytes or -1 for
3930: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a   an error.. *. *
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 2d 2d  ----------------
3980: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
3990: 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  nt.PasswordCallb
39a0: 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69  ack(char *buf, i
39b0: 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72 77 66  nt size, int rwf
39c0: 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61 74 61  lag, void *udata
39d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
39e0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
39f0: 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54   *) udata;.    T
3a00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3a10: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
3a20: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
3a30: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
3a40: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 54 63 6c  nt code;.    Tcl
3a50: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20 20 20 20  _Size len;..    
3a60: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
3a70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  );..    /* If no
3a80: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64   callback, use d
3a90: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20  efault callback 
3aa0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
3ab0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d  Ptr->password ==
3ac0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63   NULL) {..if (Tc
3ad0: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c  l_EvalEx(interp,
3ae0: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
3af0: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  , -1, TCL_EVAL_G
3b00: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b  LOBAL) == TCL_OK
3b10: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72  ) {..    char *r
3b20: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3b30: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3b40: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3b50: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65  ult(interp), &le
3b60: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  n);..    if (len
3b70: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   > (Tcl_Size) si
3b80: 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e 20 3d 20  ze-1) {...len = 
3b90: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d  (Tcl_Size) size-
3ba0: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73  1;..    }..    s
3bb0: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
3bc0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
3bd0: 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d 20 3d 20  .    buf[len] = 
3be0: 27 5c 30 27 3b 0a 09 20 20 20 20 72 65 74 75 72  '\0';..    retur
3bf0: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20  n (int) len;..} 
3c00: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75  else {..    retu
3c10: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a  rn -1;..}.    }.
3c20: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
3c30: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
3c40: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20  ith fn, rwflag, 
3c50: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f  and size args */
3c60: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
3c70: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
3c80: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
3c90: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
3ca0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3cb0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3cc0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3cd0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  j("password", -1
3ce0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3cf0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3d00: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d10: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
3d20: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c  wflag));.    Tcl
3d30: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3d40: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3d50: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3d60: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20  Obj(size));..   
3d70: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
3d80: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
3d90: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  p);.    Tcl_Pres
3da0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
3db0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
3dc0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
3dd0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
3de0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
3df0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
3e00: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
3e10: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
3e20: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
3e30: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
3e40: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode != TCL_OK) {
3e50: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
3e60: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
3e70: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
3e80: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
3e90: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
3ea0: 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63  terp);.#else..Tc
3eb0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65  l_BackgroundExce
3ec0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f  ption(interp, co
3ed0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
3ee0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
3ef0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3f00: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
3f10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
3f20: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
3f30: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
3f40: 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f  pass back passwo
3f50: 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72  rd string and tr
3f60: 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f  uncate if too lo
3f70: 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f  ng */.    if (co
3f80: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
3f90: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68  .char *ret = (ch
3fa0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72  ar *) Tcl_GetStr
3fb0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47  ingFromObj(Tcl_G
3fc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3fd0: 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  rp), &len);..if 
3fe0: 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65  (len > (Tcl_Size
3ff0: 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20  ) size-1) {..   
4000: 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65   len = (Tcl_Size
4010: 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74  ) size-1;..}..st
4020: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20  rncpy(buf, ret, 
4030: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09  (size_t) len);..
4040: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  buf[len] = '\0';
4050: 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43  ..Tcl_Release((C
4060: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
4070: 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e 74  p);..return (int
4080: 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  ) len;.    }.   
4090: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
40a0: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70  ientData) interp
40b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  );.    return -1
40c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20  --------------. 
4110: 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c  *. * Session Cal
4120: 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74  lback for Client
4130: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65  s --. *. *.Calle
4140: 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73  d when a new ses
4150: 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f  sion is added to
4160: 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54   the cache. In T
4170: 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d  LS 1.3. *.this m
4180: 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d  ay be received m
4190: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66  ultiple times af
41a0: 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ter the handshak
41b0: 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65  e. For. *.earlie
41c0: 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73  r versions, this
41d0: 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65   will be receive
41e0: 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e  d during the han
41f0: 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20  dshake.. *.This 
4200: 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65 64  is the preferred
4210: 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   way to obtain a
4220: 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69   resumable sessi
4230: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  on.. *. * Result
4240: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
4250: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4260: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
4270: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
4280: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
4290: 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77  :. *.0 = error w
42a0: 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c  here session wil
42b0: 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  l be immediately
42c0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
42d0: 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
42e0: 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73  .. *.1 = success
42f0: 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61 69   where app retai
4300: 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65  ns session in se
4310: 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64  ssion cache, and
4320: 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53   must call SSL_S
4330: 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68  ESSION_free() wh
4340: 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d  en done.. *. *--
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 2d 2d 2d 2d  ----------------
4390: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
43a0: 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b  .SessionCallback
43b0: 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53  (SSL *ssl, SSL_S
43c0: 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29  ESSION *session)
43d0: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
43e0: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
43f0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
4400: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20  a((SSL *)ssl);. 
4410: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
4420: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
4430: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
4440: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
4450: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4460: 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a  d char *ticket;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4480: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
4490: 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  _id;.    size_t 
44a0: 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e  len2;.    unsign
44b0: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20  ed int ulen;..  
44c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
44d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
44e0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
44f0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
4500: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
4510: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
4520: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
4530: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ssl == NULL) {..
4540: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4550: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
4560: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4570: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
4580: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
4590: 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 73   session id, ses
45a0: 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e 64  sion ticket, and
45b0: 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 2a   lifetime args *
45c0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
45d0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
45e0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
45f0: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
4600: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4610: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4620: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4630: 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31  bj("session", -1
4640: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
4650: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4660: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4670: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
4680: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
4690: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
46a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
46b0: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
46c0: 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69   id */.    sessi
46d0: 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
46e0: 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69  ION_get_id(sessi
46f0: 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20  on, &ulen);.    
4700: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4710: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4720: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
4730: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73  ByteArrayObj(ses
4740: 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69  sion_id, (Tcl_Si
4750: 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20  ze) ulen));..   
4760: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b   /* Session tick
4770: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45  et */.    SSL_SE
4780: 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
4790: 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
47a0: 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20  et, &len2);.    
47b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
47c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
47d0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
47e0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63  ByteArrayObj(tic
47f0: 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ket, (Tcl_Size) 
4800: 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  len2));..    /* 
4810: 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65  Lifetime - numbe
4820: 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  r of seconds */.
4830: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4840: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4850: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63  erp, cmdPtr,..Tc
4860: 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f  l_NewLongObj((lo
4870: 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  ng) SSL_SESSION_
4880: 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
4890: 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
48a0: 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  )));..    /* Eva
48b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
48c0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
48d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
48e0: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
48f0: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
4900: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
4910: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4920: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
4930: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 66     /* Return 0 f
4940: 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65 73  or now until ses
4950: 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69 73  sion handling is
4960: 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 20   complete */.   
4970: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f   return 0;.}.../
4980: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c  -------. *. * AL
49d0: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  PN Callback for 
49e0: 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20  Servers and NPN 
49f0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
4a00: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65  ents --. *. *.Pe
4a10: 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28  rform protocol (
4a20: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
4a30: 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f  , etc.) selectio
4a40: 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63  n for the. *.inc
4a50: 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  oming connection
4a60: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48  . Called after H
4a70: 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20  ello and server 
4a80: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68  callbacks.. *.Wh
4a90: 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c  ere 'out' is sel
4aa0: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
4ab0: 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70  nd 'in' is the p
4ac0: 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c  eer advertised l
4ad0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ist.. *. * Resul
4ae0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
4af0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4b00: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
4b10: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
4b20: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
4b30: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
4b40: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72  _ERR_OK: ALPN pr
4b50: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
4b60: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4b70: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
4b80: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
4b90: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20  RT_FATAL: There 
4ba0: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62  was no overlap b
4bb0: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e  etween the clien
4bc0: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c  t's. *.    suppl
4bd0: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ied list and the
4be0: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72   server configur
4bf0: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ation. The conne
4c00: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62  ction will be ab
4c10: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c  orted.. *.SSL_TL
4c20: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
4c30: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  ALPN protocol no
4c40: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e  t selected, e.g.
4c50: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50  , because no ALP
4c60: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f  N. *.    protoco
4c70: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65  ls are configure
4c80: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65  d for this conne
4c90: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ction. The conne
4ca0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
4cb0: 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
4d00: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c  atic int.ALPNCal
4d10: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20  lback(SSL *ssl, 
4d20: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4d30: 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67  har **out, unsig
4d40: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e  ned char *outlen
4d50: 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ,..const unsigne
4d60: 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69  d char *in, unsi
4d70: 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20  gned int inlen, 
4d80: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
4d90: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4da0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
4db0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4dc0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4dd0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4de0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4df0: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65      int code, re
4e00: 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  s;..    dprintf(
4e10: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
4e20: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
4e30: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
4e40: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
4e50: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4e60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
4e70: 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  lect protocol */
4e80: 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c  .    if (SSL_sel
4e90: 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28  ect_next_proto((
4ea0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
4eb0: 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73  ) out, outlen, s
4ec0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c  tatePtr->protos,
4ed0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4ee0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65  s_len,..in, inle
4ef0: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50  n) == OPENSSL_NP
4f00: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a  N_NEGOTIATED) {.
4f10: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20  ./* Match found 
4f20: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4f30: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4f40: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50   } else {../* OP
4f50: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45  ENSSL_NPN_NO_OVE
4f60: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61  RLAP = No overla
4f70: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20  p, so use first 
4f80: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74  item from client
4f90: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a   protocol list *
4fa0: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  /..res = SSL_TLS
4fb0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4fc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
4fd0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
4fe0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4ff0: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20  {..return res;. 
5000: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
5010: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
5020: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
5030: 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69  n, depth, cert i
5040: 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73  nfo list, status
5050: 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73  , and error args
5060: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
5070: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
5080: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
5090: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
50a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
50b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
50c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
50d0: 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20  ("alpn", -1));. 
50e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
50f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5100: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
5110: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5120: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
5130: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
5140: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
5150: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5160: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5170: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5180: 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74  StringObj((const
5190: 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d   char *) *out, -
51a0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
51b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
51c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
51d0: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
51e0: 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54  Obj(res == SSL_T
51f0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a  LSEXT_ERR_OK));.
5200: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5210: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5220: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5230: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5240: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5250: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5260: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5270: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5280: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5290: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
52a0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
52b0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
52c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
52d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
52e0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
52f0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
5300: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
5310: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
5320: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
5330: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  res;.}.../*. *--
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 2d 2d 2d 2d  ----------------
5380: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73  -. *. * Advertis
5390: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c  e Protocols Call
53a0: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72  back for Next Pr
53b0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
53c0: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76  on (NPN) in Serv
53d0: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a  erHello --. *. *
53e0: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54  .called when a T
53f0: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20  LS server needs 
5400: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72  a list of suppor
5410: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f  ted protocols fo
5420: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63  r Next. *.Protoc
5430: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a  ol Negotiation..
5440: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
5450: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
5460: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a  e effects:. *. *
5470: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
5480: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5490: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f  _OK: NPN protoco
54a0: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
54b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
54c0: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
54d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e  EXT_ERR_NOACK: N
54e0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  PN protocol not 
54f0: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f  selected. The co
5500: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5510: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
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 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5560: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
5570: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61  static int.NPNCa
5580: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
5590: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
55a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
55b0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  , unsigned int *
55c0: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72  outlen, void *ar
55d0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
55e0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
55f0: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72  e*)arg;..    dpr
5600: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
5610: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
5620: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
5630: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5640: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5650: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5660: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73  /* Set protocols
5670: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20   list */.    if 
5680: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
5690: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f  s != NULL) {..*o
56a0: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70  ut = statePtr->p
56b0: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20  rotos;..*outlen 
56c0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
56d0: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
56e0: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c  se {..*out = NUL
56f0: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b  L;..*outlen = 0;
5700: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5710: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
5720: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5730: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5740: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a  K;.}.#endif.../*
5750: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49  ------. *. * SNI
57a0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
57b0: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  rvers --. *. *.P
57c0: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69  erform server-si
57d0: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  de SNI hostname 
57e0: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20  selection after 
57f0: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78  receiving SNI ex
5800: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c  tension. *.in Cl
5810: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c  ient Hello. Call
5820: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63  ed after hello c
5830: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f  allback but befo
5840: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b  re ALPN callback
5850: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5860: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
5870: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
5880: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
5890: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
58a0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
58b0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
58c0: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  R_OK: SNI hostna
58d0: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20  me is accepted. 
58e0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
58f0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
5900: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5910: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73  T_FATAL: SNI hos
5920: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
5930: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  epted. The conne
5940: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20  ction. *.    is 
5950: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74  aborted. Default
5960: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53   for alert is SS
5970: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5980: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54  D_NAME.. *.SSL_T
5990: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
59a0: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73  WARNING: SNI hos
59b0: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
59c0: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61  epted, warning a
59d0: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74  lert. *.    sent
59e0: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20   (not supported 
59f0: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65  in TLSv1.3). The
5a00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
5a10: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
5a20: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
5a30: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
5a40: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64  not accepted and
5a50: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65   not acknowledge
5a60: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69  d,. *.    e.g. i
5a70: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65  f SNI has not be
5a80: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54  en configured. T
5a90: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5aa0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
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 2d 2d 2d 2d  ----------------
5af0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
5b00: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .SNICallback(con
5b10: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
5b20: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
5b30: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5b40: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5b50: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
5b60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
5b70: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
5b80: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
5b90: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
5ba0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20   code, res;.    
5bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76  const char *serv
5bc0: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  ername = NULL;..
5bd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5be0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
5bf0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
5c00: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
5c10: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5c20: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5c30: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77  }..    /* Only w
5c40: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32  orks for TLS 1.2
5c50: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a   and earlier */.
5c60: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
5c70: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e   SSL_get_servern
5c80: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
5c90: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
5ca0: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65  me);.    if (!se
5cb0: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76  rvername || serv
5cc0: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30  ername[0] == '\0
5cd0: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ') {..return SSL
5ce0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5cf0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
5d00: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
5d10: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
5d20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
5d30: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5d40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5d50: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
5d60: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
5d70: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20  han, and server 
5d80: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  name args */.   
5d90: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
5da0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
5db0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
5dc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5dd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5de0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5df0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c  StringObj("sni",
5e00: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5e10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5e20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5e30: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
5e40: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
5e50: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
5e60: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
5e70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5e80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5e90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5ea0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5eb0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d  j(servername , -
5ec0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
5ed0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
5ee0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
5ef0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5f00: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
5f10: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
5f20: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
5f30: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
5f40: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5f50: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57  SEXT_ERR_ALERT_W
5f60: 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20  ARNING;..*alert 
5f70: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  = SSL_AD_UNRECOG
5f80: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e  NIZED_NAME; /* N
5f90: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
5fa0: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d  TLS 1.3 */.    }
5fb0: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
5fc0: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
5fd0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5fe0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
5ff0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
6000: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
6010: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41  ..*alert = SSL_A
6020: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
6030: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70  AME; /* Not supp
6040: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33  orted by TLS 1.3
6050: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   */.    }.    Tc
6060: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6070: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6080: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
6090: 2a 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 2d  ----------------
60d0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e  ----. *. * Clien
60e0: 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65  tHello Handshake
60f0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
6100: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55  rvers --. *. *.U
6110: 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f  sed by server to
6120: 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72   examine the ser
6130: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74  ver name indicat
6140: 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73  ion (SNI) extens
6150: 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20  ion. *.provided 
6160: 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e  by the client in
6170: 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74   order to select
6180: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
6190: 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20  certificate to. 
61a0: 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d  *.present, and m
61b0: 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67  ake other config
61c0: 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65  uration adjustme
61d0: 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20  nts relevant to 
61e0: 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e  that server. *.n
61f0: 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66  ame and its conf
6200: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iguration. This 
6210: 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e  includes swappin
6220: 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69  g out the associ
6230: 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20  ated. *.SSL_CTX 
6240: 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69  pointer, modifyi
6250: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20  ng the server's 
6260: 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65  list of permitte
6270: 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a  d TLS versions,.
6280: 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20   *.changing the 
6290: 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 20  server's cipher 
62a0: 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65  list in response
62b0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73   to the client's
62c0: 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74   cipher list, et
62d0: 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66  c.. *.Called bef
62e0: 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e  ore SNI and ALPN
62f0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20   callbacks.. *. 
6300: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
6310: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
6320: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
6330: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
6340: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
6350: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
6360: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
6370: 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65  TRY: suspend the
6380: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20   handshake, and 
6390: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75  the handshake fu
63a0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75  nction will retu
63b0: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20  rn immediately. 
63c0: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
63d0: 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72  LO_ERROR: failur
63e0: 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e  e, terminate con
63f0: 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65  nection. Set ale
6400: 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65  rt to error code
6410: 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  .. *.SSL_CLIENT_
6420: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73  HELLO_SUCCESS: s
6430: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d  uccess. *. *----
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 2d 2d 2d 2d 2d 0a  ---------------.
6480: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48   */.static int.H
6490: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c  elloCallback(SSL
64a0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
64b0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
64c0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
64d0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
64e0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
64f0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
6500: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
6510: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
6520: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
6530: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
6540: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
6550: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
6560: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
6570: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65    size_t len, re
6580: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70  maining;..    dp
6590: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
65a0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
65b0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
65c0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
65d0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
65e0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
65f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
6600: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c  sl == (const SSL
6610: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d   *)NULL || arg =
6620: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20  = (void *)NULL) 
6630: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
6640: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6650: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6660: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  Get names */.   
6670: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74   if (!SSL_client
6680: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28  _hello_get0_ext(
6690: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45  ssl, TLSEXT_TYPE
66a0: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70  _server_name, &p
66b0: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c  , &remaining) ||
66c0: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29   remaining <= 2)
66d0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
66e0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
66f0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
6700: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6710: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6730: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67  Extract the leng
6740: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  th of the suppli
6750: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73  ed list of names
6760: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28  . */.    len = (
6770: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
6780: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
6790: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
67a0: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b   != remaining) {
67b0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
67c0: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c  _SSLV3_ALERT_ILL
67d0: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a  EGAL_PARAMETER;.
67e0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
67f0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6800: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6810: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20  ing = len;..    
6820: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70  /* The list in p
6830: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73  ractice only has
6840: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
6850: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f  t, so we only co
6860: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74  nsider the first
6870: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20   one. */.    if 
6880: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20  (remaining == 0 
6890: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58  || *p++ != TLSEX
68a0: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
68b0: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20  name) {..*alert 
68c0: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
68d0: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
68e0: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
68f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6900: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
6910: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20  maining--;..    
6920: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69  /* Now we can fi
6930: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74  nally pull out t
6940: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69  he byte array wi
6950: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f  th the actual ho
6960: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69  stname. */.    i
6970: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  f (remaining <= 
6980: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
6990: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
69a0: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
69b0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
69c0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
69d0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
69e0: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
69f0: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6a00: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6a10: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20   2 > remaining) 
6a20: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6a30: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6a40: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
6a50: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6a60: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6a70: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6a80: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72  g = len;.    ser
6a90: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  vername = (const
6aa0: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20   char *)p;..    
6ab0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
6ac0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
6ad0: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72  n, chan, and ser
6ae0: 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f  ver name args */
6af0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
6b00: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
6b10: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
6b20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6b30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6b40: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
6b50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68  _NewStringObj("h
6b60: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  ello", -1));.   
6b70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6b80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6b90: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
6ba0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6bb0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
6bc0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
6bd0: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
6be0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6bf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6c00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
6c10: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
6c20: 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  me, (Tcl_Size) l
6c30: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
6c40: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
6c50: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6c60: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6c70: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6c80: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6c90: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6ca0: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6cb0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6cc0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6cd0: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6ce0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
6cf0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
6d00: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
6d10: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
6d20: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6d30: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
6d40: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
6d50: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6d60: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6d70: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6d80: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6d90: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6da0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6db0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6dc0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6de0: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6df0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6e10: 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6e60: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d   CiphersObjCmd -
6e70: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
6e80: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54   ciphers. *. *.T
6e90: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6ea0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6eb0: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
6ec0: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
6ed0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
6ee0: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
6ef0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
6f00: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
6f10: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6f20: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6f30: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
6f40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6f50: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
6f60: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
6f70: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (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 2d 2d 2d  ----------------
6fc0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
6fd0: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  nst char *protoc
6fe0: 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32  ols[] = {.."ssl2
6ff0: 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31  ", "ssl3", "tls1
7000: 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c  ", "tls1.1", "tl
7010: 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c  s1.2", "tls1.3",
7020: 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72   NULL.};.enum pr
7030: 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53  otocol {.    TLS
7040: 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c  _SSL2, TLS_SSL3,
7050: 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54   TLS_TLS1, TLS_T
7060: 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f  LS1_1, TLS_TLS1_
7070: 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54  2, TLS_TLS1_3, T
7080: 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74  LS_NONE.};..stat
7090: 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62  ic int.CiphersOb
70a0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
70b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
70c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
70d0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
70e0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
70f0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
7100: 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  objPtr = NULL;. 
7110: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20     SSL_CTX *ctx 
7120: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20  = NULL;.    SSL 
7130: 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  *ssl = NULL;.   
7140: 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49   STACK_OF(SSL_CI
7150: 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63  PHER) *sk;.    c
7160: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b  har buf[BUFSIZ];
7170: 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20  .    int index, 
7180: 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65  verbose = 0, use
7190: 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a  _supported = 0;.
71a0: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45      const SSL_ME
71b0: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 20  THOD *method;.  
71c0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
71d0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ata;..    dprint
71e0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
71f0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29    if ((objc < 2)
7200: 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20   || (objc > 4)) 
7210: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
7220: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
7230: 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f  bjv, "protocol ?
7240: 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72  verbose? ?suppor
7250: 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ted?");..return 
7260: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7270: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
7280: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
7290: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72  erp, objv[1], pr
72a0: 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63  otocols, "protoc
72b0: 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20  ol", 0, &index) 
72c0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
72d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
72e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f      }.    if ((o
72f0: 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f  bjc > 2) && Tcl_
7300: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
7310: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
7320: 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20  ], &verbose) != 
7330: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
7340: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7350: 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63   }.    if ((objc
7360: 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74   > 3) && Tcl_Get
7370: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
7380: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
7390: 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20  &use_supported) 
73a0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
73b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
73c0: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
73d0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
73e0: 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d     switch ((enum
73f0: 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29   protocol)index)
7400: 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c   {..case TLS_SSL
7410: 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  2:.#if OPENSSL_V
7420: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
7430: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20   0x10100000L || 
7440: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
7450: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7460: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20  SSL_NO_SSL2)..  
7470: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7480: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
7490: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
74a0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
74b0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
74c0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  ) NULL);..    re
74d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
74e0: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f  #else..    metho
74f0: 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64  d = SSLv2_method
7500: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7510: 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33  f..case TLS_SSL3
7520: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
7530: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
7540: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
7550: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
7560: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
7570: 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41  THOD)..    Tcl_A
7580: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7590: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
75a0: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
75b0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
75c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
75d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
75e0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
75f0: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c      method = SSL
7600: 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  v3_method(); bre
7610: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7620: 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64   TLS_TLS1:.#if d
7630: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
7640: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7650: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  SL_NO_TLS1) || d
7660: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7670: 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09  O_TLS1_METHOD)..
7680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
7690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
76a0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
76b0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
76c0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
76d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
76e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
76f0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7700: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68  hod = TLSv1_meth
7710: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7720: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
7730: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_1:.#if define
7740: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
7750: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7760: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
7770: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7780: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
7790: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
77a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
77b0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
77c0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
77d0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
77e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
77f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7800: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
7810: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d  thod = TLSv1_1_m
7820: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
7830: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
7840: 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66  _TLS1_2:.#if def
7850: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
7860: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7870: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  SL_NO_TLS1_2) ||
7880: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7890: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f  _NO_TLS1_2_METHO
78a0: 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  D)..    Tcl_Appe
78b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
78c0: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
78d0: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
78e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
78f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
7900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7910: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
7920: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f   method = TLSv1_
7930: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  2_method(); brea
7940: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
7950: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20  TLS_TLS1_3:.#if 
7960: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7970: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
7980: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
7990: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
79a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
79b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
79c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
79d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
79e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
79f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7a00: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7a10: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68  ethod = TLS_meth
7a20: 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  od();..    SSL_C
7a30: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
7a40: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
7a50: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
7a60: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7a70: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
7a80: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
7a90: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65  RSION);..    bre
7aa0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61  ak;.#endif..defa
7ab0: 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64  ult:..    method
7ac0: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
7ad0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ..    break;.   
7ae0: 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53   }..    ctx = SS
7af0: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64  L_CTX_new(method
7b00: 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d  );.    if (ctx =
7b10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7b20: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7b30: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53  rp, GET_ERR_REAS
7b40: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
7b50: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
7b60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7b70: 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65      ssl = SSL_ne
7b80: 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28  w(ctx);.    if (
7b90: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ssl == NULL) {..
7ba0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7bb0: 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52  (interp, GET_ERR
7bc0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
7bd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
7be0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
7bf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7c00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7c10: 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64  Use list and ord
7c20: 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  er as would be s
7c30: 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48  ent in a ClientH
7c40: 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69  ello or all avai
7c50: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f  lable ciphers */
7c60: 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70  .    if (use_sup
7c70: 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20  ported) {..sk = 
7c80: 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74  SSL_get1_support
7c90: 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b  ed_ciphers(ssl);
7ca0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
7cb0: 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68  k = SSL_get_ciph
7cc0: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  ers(ssl);.    }.
7cd0: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e  .    if (sk != N
7ce0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72  ULL) {..if (!ver
7cf0: 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e  bose) {..    con
7d00: 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20  st char *cp;..  
7d10: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7d20: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
7d30: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e  L);..    for (in
7d40: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
7d50: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
7d60: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e  k); i++) {...con
7d70: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
7d80: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   = sk_SSL_CIPHER
7d90: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09  _value(sk, i);..
7da0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20  .if (c == NULL) 
7db0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20  continue;..../* 
7dc0: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28  cipher name or (
7dd0: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20  NONE) */...cp = 
7de0: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e  SSL_CIPHER_get_n
7df0: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70  ame(c);...if (cp
7e00: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b   == NULL) break;
7e10: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
7e20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
7e30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
7e40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
7e50: 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b 0a  ar *) cp, -1));.
7e60: 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20  .    }...} else 
7e70: 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  {..    objPtr = 
7e80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7e90: 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72  ("",0);..    for
7ea0: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
7eb0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e   sk_SSL_CIPHER_n
7ec0: 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09  um(sk); i++) {..
7ed0: 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45  .const SSL_CIPHE
7ee0: 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49  R *c = sk_SSL_CI
7ef0: 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69  PHER_value(sk, i
7f00: 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55  );...if (c == NU
7f10: 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09  LL) continue;...
7f20: 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63  ./* textual desc
7f30: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ription of the c
7f40: 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53  ipher */...if (S
7f50: 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69  SL_CIPHER_descri
7f60: 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69  ption(c, buf, si
7f70: 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55  zeof(buf)) != NU
7f80: 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  LL) {...    Tcl_
7f90: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50  AppendToObj(objP
7fa0: 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69  tr, buf, (Tcl_Si
7fb0: 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29  ze) strlen(buf))
7fc0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
7fd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f     Tcl_AppendToO
7fe0: 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e  bj(objPtr, "UNKN
7ff0: 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a  OWN\n", 8);...}.
8000: 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75  .    }..}..if (u
8010: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
8020: 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48  .    sk_SSL_CIPH
8030: 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a  ER_free(sk);..}.
8040: 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72      }.    SSL_fr
8050: 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c  ee(ssl);.    SSL
8060: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
8070: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
8080: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
8090: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
80a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
80b0: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f  ------. *. * Pro
8100: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20  tocolsObjCmd -- 
8110: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70  list available p
8120: 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54  rotocols. *. *.T
8130: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
8140: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
8150: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72  ess the "tls::pr
8160: 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64  otocols" command
8170: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
8180: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e  lable protocols.
8190: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
81a0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
81b0: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20  l result list.. 
81c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
81d0: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.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 2d 2d  ----------------
8220: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
8230: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  nt.ProtocolsObjC
8240: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
8250: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
8260: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
8270: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
8280: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8290: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
82a0: 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29  jPtr;.    (void)
82b0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
82c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
82d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
82e0: 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f  jc != 1) {..Tcl_
82f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8300: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
8310: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
8320: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8330: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
8340: 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ();..    objPtr 
8350: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
8360: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20  (0, NULL);..#if 
8370: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
8380: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
8390: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
83a0: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
83b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
83c0: 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c  _SSL2).    Tcl_L
83d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
83e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
83f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8400: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8410: 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a  LS_SSL2], -1));.
8420: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8430: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
8440: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8450: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
8460: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8470: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
8480: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8490: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
84a0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
84b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
84c0: 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c  ocols[TLS_SSL3],
84d0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
84e0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
84f0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
8500: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
8510: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8520: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
8530: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
8540: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8550: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8560: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8570: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8580: 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  _TLS1], -1));.#e
8590: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
85a0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
85b0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
85c0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
85d0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
85e0: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
85f0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
8600: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8610: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8620: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8630: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
8640: 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_1], -1));.#en
8650: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8660: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
8670: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8680: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
8690: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
86a0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
86b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
86c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
86d0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
86e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
86f0: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53  rotocols[TLS_TLS
8700: 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  1_2], -1));.#end
8710: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
8720: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
8730: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8740: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63  O_TLS1_3).    Tc
8750: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8760: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8770: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8780: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
8790: 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d  s[TLS_TLS1_3], -
87a0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  1));.#endif..   
87b0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
87c0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
87d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
87e0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
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 2d 2d 2d  ----------------
8830: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61  --. *. * Handsha
8840: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  keObjCmd --. *. 
8850: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  *.This command i
8860: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
8870: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e   whether the han
8880: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65  dshake is comple
8890: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a  te. *.or not.. *
88a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
88b0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
88c0: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68  esult. 1 means h
88d0: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74  andshake complet
88e0: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69  e, 0 means pendi
88f0: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ng.. *. * Side e
8900: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66  ffects:. *.May f
8910: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61  orce SSL negotia
8920: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61  tion to take pla
8930: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ce.. *. *-------
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 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
8980: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64  .static int Hand
8990: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65  shakeObjCmd(Clie
89a0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
89b0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
89c0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
89d0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
89e0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
89f0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20  l_Channel chan; 
8a00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
8a10: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
8a20: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
8a30: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20  tate *statePtr; 
8a40: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74         /* client
8a50: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
8a60: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e  ocket */.    con
8a70: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20  st char *errStr 
8a80: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
8a90: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  ret = 1;.    int
8aa0: 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76   err = 0;.    (v
8ab0: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
8ac0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
8ad0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
8ae0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
8af0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8b00: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
8b10: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
8b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8b40: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8b50: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
8b60: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
8b70: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
8b80: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
8b90: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
8ba0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
8bb0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
8bc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8bd0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
8be0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
8bf0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
8c00: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
8c10: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
8c20: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
8c30: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
8c40: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
8c50: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
8c60: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
8c70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
8c80: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
8c90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
8ca0: 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22  me(chan),..    "
8cb0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
8cc0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
8cd0: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
8ce0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
8cf0: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48  , "TLS", "HANDSH
8d00: 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  AKE", "CHANNEL",
8d10: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
8d20: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
8d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8d40: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
8d50: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
8d60: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
8d70: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
8d80: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
8d90: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
8da0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72  Connect");.    r
8db0: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  et = Tls_WaitFor
8dc0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
8dd0: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20  , &err, 1);.    
8de0: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69  dprintf("Tls_Wai
8df0: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75  tForConnect retu
8e00: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b  rned: %i", ret);
8e10: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20  ..    if (ret < 
8e20: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d  0 && ((statePtr-
8e30: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
8e40: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20  _ASYNC) && (err 
8e50: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09  == EAGAIN))) {..
8e60: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73  dprintf("Async s
8e70: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47  et and err = EAG
8e80: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b  AIN");..ret = 0;
8e90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8ea0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67  ret < 0) {..long
8eb0: 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72   result;..errStr
8ec0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72   = statePtr->err
8ed0: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75  ;..Tcl_ResetResu
8ee0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c  lt(interp);..Tcl
8ef0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a  _SetErrno(err);.
8f00: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c  ..if (!errStr ||
8f10: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29   (*errStr == 0))
8f20: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d   {..    errStr =
8f30: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28   Tcl_PosixError(
8f40: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63  interp);..}...Tc
8f50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8f60: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b  nterp, "handshak
8f70: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72  e failed: ", err
8f80: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  Str, (char *) NU
8f90: 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c  LL);..if ((resul
8fa0: 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  t = SSL_get_veri
8fb0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
8fc0: 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30  tr->ssl)) != X50
8fd0: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  9_V_OK) {..    T
8fe0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8ff0: 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f  interp, " due to
9000: 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66   \"", X509_verif
9010: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
9020: 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22  ing(result), "\"
9030: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9040: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72  );..}..Tcl_SetEr
9050: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
9060: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b  "TLS", "HANDSHAK
9070: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  E", "FAILED", (c
9080: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64  har *) NULL);..d
9090: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
90a0: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68  g TCL_ERROR with
90b0: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65   handshake faile
90c0: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b  d: %s", errStr);
90d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
90e0: 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OR;.    } else {
90f0: 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29 20  ..if (err != 0) 
9100: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
9110: 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74  Got an error wit
9120: 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61  h a completed ha
9130: 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25  ndshake: err = %
9140: 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65  i", err);..}..re
9150: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
9160: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
9170: 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68  ning TCL_OK with
9180: 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72   data \"%i\"", r
9190: 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  et);.    Tcl_Set
91a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
91b0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
91c0: 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ret));.    retur
91d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
91e0: 20 2a 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: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f  -----. *. * Impo
9230: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  rtObjCmd --. *. 
9240: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
9250: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
9260: 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22  rocess the "ssl"
9270: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54   command. *. *.T
9280: 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70  he ssl command p
9290: 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61  ushes SSL over a
92a0: 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65   (newly connecte
92b0: 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a  d) tcp socket. *
92c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
92d0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
92e0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
92f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
9300: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68  y modify the beh
9310: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63  avior of an IO c
9320: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
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 2d 2d 2d 2d 2d  ----------------
9370: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
9380: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69  ImportObjCmd(Cli
9390: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
93a0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
93b0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
93c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
93d0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
93e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
93f0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
9400: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
9410: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
9420: 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
9430: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
9440: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
9450: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09    SSL_CTX *ctx..
9460: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9470: 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 4e  Obj *script..= N
9480: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
9490: 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e 55   *password..= NU
94a0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
94b0: 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *vcmd..= NULL;. 
94c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75     Tcl_DString u
94d0: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
94e0: 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61  lation, upperCha
94f0: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70  nnelBlocking, up
9500: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
9510: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ng, upperChannel
9520: 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74  EOFChar;.    int
9530: 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69   idx;.    Tcl_Si
9540: 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  ze len;.    int 
9550: 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43  flags...= TLS_TC
9560: 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20  L_INIT;.    int 
9570: 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a  server...= 0;./*
9580: 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69   is connection i
9590: 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f  ncoming or outgo
95a0: 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72  ing? */.    char
95b0: 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c   *keyfile..= NUL
95c0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72  L;.    char *cer
95d0: 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20  tfile..= NULL;. 
95e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
95f0: 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20   *key..= NULL;. 
9600: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f     Tcl_Size key_
9610: 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e  len..= 0;.    un
9620: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
9630: 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  t..= NULL;.    T
9640: 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e  cl_Size cert_len
9650: 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  ..= 0;.    char 
9660: 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c  *ciphers..= NULL
9670: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9680: 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c  ersuites..= NULL
9690: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69  ;.    char *CAfi
96a0: 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  le..= NULL;.    
96b0: 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20  char *CApath..= 
96c0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
96d0: 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c  DHparams..= NULL
96e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65  ;.    char *mode
96f0: 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  l...= NULL;.    
9700: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
9710: 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73  ..= NULL;./* hos
9720: 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72  tname for Server
9730: 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e   Name Indication
9740: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 73 65   */.    char *se
9750: 73 73 69 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c  ssion_id..= NULL
9760: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  ;.    Tcl_Obj *a
9770: 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  lpn..= NULL;.   
9780: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73   int ssl2 = 0, s
9790: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sl3 = 0;.    int
97a0: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f   tls1 = 1, tls1_
97b0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20  1 = 1, tls1_2 = 
97c0: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20  1, tls1_3 = 1;. 
97d0: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30     int proto = 0
97e0: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20  , level = -1;.  
97f0: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30    int verify = 0
9800: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72  , require = 0, r
9810: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74  equest = 1, post
9820: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a  _handshake = 0;.
9830: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
9840: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
9850: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
9860: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
9870: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
9880: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
9890: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23  .    tls1 = 0;.#
98a0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
98b0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
98c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
98d0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74  NO_TLS1_1).    t
98e0: 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_1 = 0;.#endi
98f0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
9900: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
9910: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9920: 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_2).    tls1_
9930: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 0;.#endif.#i
9940: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
9950: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
9960: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
9970: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20  3).    tls1_3 = 
9980: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  0;.#endif..    i
9990: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
99a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
99b0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
99c0: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69  , "channel ?opti
99d0: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ons?");..return 
99e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
99f0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
9a00: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
9a10: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
9a20: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
9a30: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
9a40: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ]), NULL);.    i
9a50: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
9a60: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
9a70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9a80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
9a90: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
9aa0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
9ab0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
9ac0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
9ad0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
9ae0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
9af0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
9b00: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
9b10: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
9b20: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78  tString(objv[idx
9b30: 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d  ]);...if (opt[0]
9b40: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72   != '-')..    br
9b50: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d  eak;...OPTOBJ("-
9b60: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f  alpn", alpn);..O
9b70: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20  PTSTR("-cadir", 
9b80: 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52  CApath);..OPTSTR
9b90: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69  ("-cafile", CAfi
9ba0: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  le);..OPTBYTE("-
9bb0: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72  cert", cert, cer
9bc0: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  t_len);..OPTSTR(
9bd0: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72  "-certfile", cer
9be0: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  tfile);..OPTSTR(
9bf0: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65  "-cipher", ciphe
9c00: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  rs);..OPTSTR("-c
9c10: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73  iphers", ciphers
9c20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
9c30: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68  hersuites", ciph
9c40: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f  ersuites);..OPTO
9c50: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73  BJ("-command", s
9c60: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28  cript);..OPTSTR(
9c70: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70  "-dhparams", DHp
9c80: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45  arams);..OPTBYTE
9c90: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65  ("-key", key, ke
9ca0: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  y_len);..OPTSTR(
9cb0: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66  "-keyfile", keyf
9cc0: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ile);..OPTSTR("-
9cd0: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a  model", model);.
9ce0: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f  .OPTOBJ("-passwo
9cf0: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a  rd", password);.
9d00: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f  .OPTBOOL("-post_
9d10: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74  handshake", post
9d20: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50  _handshake);..OP
9d30: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22  TBOOL("-request"
9d40: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54  , request);..OPT
9d50: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c  BOOL("-require",
9d60: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49   require);..OPTI
9d70: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65  NT("-security_le
9d80: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f  vel", level);..O
9d90: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22  PTBOOL("-server"
9da0: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53  , server);..OPTS
9db0: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22  TR("-servername"
9dc0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09  , servername);..
9dd0: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e  OPTSTR("-session
9de0: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  _id", session_id
9df0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
9e00: 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54  l2", ssl2);..OPT
9e10: 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73  BOOL("-ssl3", ss
9e20: 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  l3);..OPTBOOL("-
9e30: 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f  tls1", tls1);..O
9e40: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22  PTBOOL("-tls1.1"
9e50: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42  , tls1_1);..OPTB
9e60: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74  OOL("-tls1.2", t
9e70: 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c  ls1_2);..OPTBOOL
9e80: 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31  ("-tls1.3", tls1
9e90: 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76  _3);..OPTOBJ("-v
9ea0: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c  alidatecommand",
9eb0: 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28   vcmd);..OPTOBJ(
9ec0: 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a  "-vcmd", vcmd);.
9ed0: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e  ..OPTBAD("option
9ee0: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69  ", "-alpn, -cadi
9ef0: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72  r, -cafile, -cer
9f00: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63  t, -certfile, -c
9f10: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75  ipher, -ciphersu
9f20: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20  ites, -command, 
9f30: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c  -dhparams, -key,
9f40: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65   -keyfile, -mode
9f50: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70  l, -password, -p
9f60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d  ost_handshake, -
9f70: 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72  request, -requir
9f80: 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76  e, -security_lev
9f90: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65  el, -server, -se
9fa0: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69  rvername, -sessi
9fb0: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73  on_id, -ssl2, -s
9fc0: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73  sl3, -tls1, -tls
9fd0: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74  1.1, -tls1.2, -t
9fe0: 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64  ls1.3, or -valid
9ff0: 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09  atecommand");...
a000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
a020: 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79  request)..verify
a030: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
a040: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
a050: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
a060: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
a070: 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79   require).verify
a080: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
a090: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
a0a0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71  ERT;.    if (req
a0b0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
a0c0: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c  dshake).verify |
a0d0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  = SSL_VERIFY_POS
a0e0: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20  T_HANDSHAKE;.   
a0f0: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30   if (verify == 0
a100: 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f  )..verify = SSL_
a110: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20  VERIFY_NONE;..  
a120: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32    proto |= (ssl2
a130: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
a140: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
a150: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53  o |= (ssl3 ? TLS
a160: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29  _PROTO_SSL3 : 0)
a170: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
a180: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  tls1 ? TLS_PROTO
a190: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20  _TLS1 : 0);.    
a1a0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31  proto |= (tls1_1
a1b0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
a1c0: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_1 : 0);.    pr
a1d0: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f  oto |= (tls1_2 ?
a1e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
a1f0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
a200: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54  o |= (tls1_3 ? T
a210: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20  LS_PROTO_TLS1_3 
a220: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  : 0);..    /* re
a230: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62  set to NULL if b
a240: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76  lank string prov
a250: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  ided */.    if (
a260: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09  cert && !*cert).
a270: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20  .        cert.  
a280: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
a290: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b    if (key && !*k
a2a0: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79  ey)..        key
a2b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a2c0: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
a2d0: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29  e && !*certfile)
a2e0: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c           certfil
a2f0: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  e.= NULL;.    if
a300: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b   (keyfile && !*k
a310: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65  eyfile)..keyfile
a320: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a330: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
a340: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20   && !*ciphers). 
a350: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20         ciphers. 
a360: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a370: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69     if (ciphersui
a380: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73  tes && !*ciphers
a390: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69  uites) ciphersui
a3a0: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20  tes    = NULL;. 
a3b0: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26     if (CAfile &&
a3c0: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20   !*CAfile).     
a3d0: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20     CAfile.      
a3e0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a3f0: 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41   (CApath && !*CA
a400: 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41  path).        CA
a410: 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e  path.        = N
a420: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70  ULL;.    if (DHp
a430: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72  arams && !*DHpar
a440: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70  ams).        DHp
a450: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e  arams        = N
a460: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77  ULL;..    /* new
a470: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20   SSL state */.  
a480: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53    statePtr..= (S
a490: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28  tate *) ckalloc(
a4a0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f  (unsigned) sizeo
a4b0: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d  f(State));.    m
a4c0: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20  emset(statePtr, 
a4d0: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29  0, sizeof(State)
a4e0: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  );..    statePtr
a4f0: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b  ->flags.= flags;
a500: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69  .    statePtr->i
a510: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a  nterp.= interp;.
a520: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66      statePtr->vf
a530: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20  lags.= verify;. 
a540: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
a550: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61  .= "";..    /* a
a560: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a  llocate script *
a570: 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74  /.    if (script
a580: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
a590: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a5a0: 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a  (script, &len);.
a5b0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a5c0: 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62   statePtr->callb
a5d0: 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20  ack = script;.. 
a5e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a5f0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61  unt(statePtr->ca
a600: 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20  llback);..}.    
a610: 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  }..    /* alloca
a620: 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20  te password */. 
a630: 20 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29     if (password)
a640: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
a650: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a660: 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b  password, &len);
a670: 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20  ..if (len) {..  
a680: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73    statePtr->pass
a690: 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b  word = password;
a6a0: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
a6b0: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
a6c0: 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20  >password);..}. 
a6d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
a6e0: 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63  ocate validate c
a6f0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66  ommand */.    if
a700: 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64   (vcmd) {..(void
a710: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a720: 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65  romObj(vcmd, &le
a730: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
a740: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
a750: 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20  cmd = vcmd;..   
a760: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a770: 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  t(statePtr->vcmd
a780: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a790: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55   if (model != NU
a7a0: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b  LL) {..int mode;
a7b0: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f  ../* Get the "mo
a7c0: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  del" context */.
a7d0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43  .chan = Tcl_GetC
a7e0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d  hannel(interp, m
a7f0: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69  odel, &mode);..i
a800: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
a810: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
a820: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
a830: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
a840: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
a850: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a860: 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d  R;..}.../*.. * M
a870: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
a880: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
a890: 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a  st channel.. */.
a8a0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54  .chan = Tcl_GetT
a8b0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
a8c0: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61  ..if (Tcl_GetCha
a8d0: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
a8e0: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
a8f0: 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  e()) {..    Tcl_
a900: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a910: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
a920: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
a930: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
a940: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
a950: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61  S channel", (cha
a960: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a970: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
a980: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
a990: 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e   "IMPORT", "CHAN
a9a0: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
a9b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a9c0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
a9d0: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
a9e0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
a9f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
aa00: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53  R;..}..ctx = ((S
aa10: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
aa20: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
aa30: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20  a(chan))->ctx;. 
aa40: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
aa50: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74  ((ctx = CTX_Init
aa60: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65  (statePtr, serve
aa70: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c  r, proto, keyfil
aa80: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79  e, certfile, key
aa90: 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65  , cert, (int) ke
aaa0: 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74  y_len,..    (int
aab0: 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61  ) cert_len, CApa
aac0: 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68  th, CAfile, ciph
aad0: 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65  ers, ciphersuite
aae0: 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61  s, level, DHpara
aaf0: 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ms)) == NULL) {.
ab00: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
ab10: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
ab20: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
ab30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ab40: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
ab50: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
ab60: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ctx;..    /*.   
ab70: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d    * We need to m
ab80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
ab90: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20  e channel works 
aba0: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74  in binary (for t
abb0: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70  he.     * encryp
abc0: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20  tion not to get 
abd0: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20  goofed up)..    
abe0: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20   * We only want 
abf0: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75  to adjust the bu
ac00: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76  ffering in pre-v
ac10: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72  2 channels, wher
ac20: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68  e.     * each ch
ac30: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61  annel in the sta
ac40: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74  ck maintained it
ac50: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20  s own buffers.. 
ac60: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44      */.    Tcl_D
ac70: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
ac80: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
ac90: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
aca0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
acb0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
acc0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
acd0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
ace0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
acf0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
ad00: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
ad10: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
ad20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ad30: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ad40: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70  "-eofchar", &upp
ad50: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
ad60: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ad70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ad80: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f  rp, chan, "-enco
ad90: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  ding", &upperCha
ada0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
adb0: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
adc0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
add0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ade0: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ion", &upperChan
adf0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
ae00: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
ae10: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ae20: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
ae30: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
ae40: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
ae50: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
ae60: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
ae70: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
ae80: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20  n", "binary");. 
ae90: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
aea0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
aeb0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
aec0: 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20  ", "true");.    
aed0: 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69  dprintf("Consumi
aee0: 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25  ng Tcl channel %
aef0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
af00: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20  elName(chan));. 
af10: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c     statePtr->sel
af20: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61  f = Tcl_StackCha
af30: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73  nnel(interp, Tls
af40: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20  _ChannelType(), 
af50: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
af60: 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41  tePtr,..(TCL_REA
af70: 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54  DABLE | TCL_WRIT
af80: 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20  ABLE), chan);.  
af90: 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74    dprintf("Creat
afa0: 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64  ed channel named
afb0: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
afc0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
afd0: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69  r->self));.    i
afe0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  f (statePtr->sel
aff0: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
b000: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  l) NULL) {../*..
b010: 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c   * No use of Tcl
b020: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  _EventuallyFree 
b030: 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69  because no possi
b040: 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65  ble Tcl_Preserve
b050: 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65  ... */..Tls_Free
b060: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
b070: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72  *) statePtr);..r
b080: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b090: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
b0a0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
b0b0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
b0c0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73  r->self, "-trans
b0d0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
b0e0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b0f0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
b100: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
b110: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b120: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b130: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e  >self, "-encodin
b140: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
b150: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
b160: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
b170: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b180: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b190: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b1a0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
b1b0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
b1c0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
b1d0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
b1e0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b1f0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b200: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  elf, "-blocking"
b210: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b220: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b230: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20  Blocking));.    
b240: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b250: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
b260: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
b270: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
b280: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
b290: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44  ding);.    Tcl_D
b2a0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b2b0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
b2c0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
b2d0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b2e0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20  nelBlocking);.. 
b2f0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
b300: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   Initialization.
b310: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74       */.    stat
b320: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f  ePtr->ssl = SSL_
b330: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74  new(statePtr->ct
b340: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61  x);.    if (!sta
b350: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f  tePtr->ssl) {../
b360: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72  * SSL library er
b370: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65  ror */..Tcl_Appe
b380: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b390: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74   "couldn't const
b3a0: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e  ruct ssl session
b3b0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b3c0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b3d0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b3e0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b3f0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b400: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46  ORT", "INIT", "F
b410: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b420: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65   NULL);..Tls_Fre
b430: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
b440: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b450: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b460: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b470: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
b480: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
b490: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f  servername) {../
b4a0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65  * Sets the serve
b4b0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
b4c0: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e  n (SNI) in Clien
b4d0: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e  tHello extension
b4e0: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20   */../* Per RFC 
b4f0: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69  6066, hostname i
b500: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65  s a ASCII encode
b510: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68  d string, though
b520: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55   RFC 4366 says U
b530: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53  TF-8. */..if (!S
b540: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f  SL_set_tlsext_ho
b550: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72  st_name(statePtr
b560: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
b570: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b  e) && require) {
b580: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b590: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b5a0: 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  Set SNI extensio
b5b0: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  n failed: ", GET
b5c0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b5d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b5e0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b5f0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b600: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53  S", "IMPORT", "S
b610: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  NI", "FAILED", (
b620: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b630: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
b640: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
b650: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b660: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b670: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73  ..}.../* Set hos
b680: 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63  tname for peer c
b690: 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e  ertificate hostn
b6a0: 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ame verification
b6b0: 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20   in clients...  
b6c0: 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73   Don't use SSL_s
b6d0: 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69  et1_host since i
b6e0: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e  t has limitation
b6f0: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  s. */..if (!SSL_
b700: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50  add1_host(stateP
b710: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
b720: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ame)) {..    Tcl
b730: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b740: 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68  terp, "Set DNS h
b750: 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20  ostname failed: 
b760: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
b770: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
b780: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b790: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b7a0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b7b0: 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20  T", "HOSTNAME", 
b7c0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b7d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b7e0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
b7f0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
b800: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
b820: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
b830: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a  ume session id *
b840: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  /.    if (sessio
b850: 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73  n_id && strlen(s
b860: 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53  ession_id) <= SS
b870: 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45  L_MAX_SID_CTX_LE
b880: 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f  NGTH) {../* SSL_
b890: 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f  set_session() */
b8a0: 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49  ..if (!SSL_SESSI
b8b0: 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65  ON_set1_id_conte
b8c0: 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69  xt(SSL_get_sessi
b8d0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
b8e0: 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69  ),...(const unsi
b8f0: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65 73  gned char *) ses
b900: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
b910: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
b920: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
b930: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b940: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
b950: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69  sume session fai
b960: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b970: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b980: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b990: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b9a0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b9b0: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
b9c0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
b9d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b9e0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
b9f0: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
ba00: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
ba10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ba20: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
ba30: 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74   Enable Applicat
ba40: 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63  ion-Layer Protoc
ba50: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20  ol Negotiation. 
ba60: 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74  Examples are: ht
ba70: 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e  tp/1.0,..http/1.
ba80: 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20  1, h2, h3, ftp, 
ba90: 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70  imap, pop3, xmpp
baa0: 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65  -client, xmpp-se
bab0: 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c  rver, mqtt, irc,
bac0: 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20   etc. */.    if 
bad0: 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e  (alpn) {../* Con
bae0: 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20  vert a TCL list 
baf0: 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d  into a protocol-
bb00: 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72  list in wire-for
bb10: 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64  mat */..unsigned
bb20: 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a   char *protos, *
bb30: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  p;..unsigned int
bb40: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b   protos_len = 0;
bb50: 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20  ..Tcl_Size cnt, 
bb60: 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f  i;..int j;..Tcl_
bb70: 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66  Obj **list;...if
bb80: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
bb90: 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
bba0: 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69   alpn, &cnt, &li
bbb0: 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  st) != TCL_OK) {
bbc0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
bbd0: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
bbe0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
bbf0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bc00: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
bc10: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
bc20: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
bc30: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
bc40: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
bc50: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
bc60: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
bc70: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
bc80: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
bc90: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
bca0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
bcb0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
bcc0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74  protocol names t
bcd0: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20  oo long", (char 
bce0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f  *) NULL);...Tcl_
bcf0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
bd00: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
bd10: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
bd20: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
bd30: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72   NULL);...Tls_Fr
bd40: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
bd50: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
bd60: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
bd70: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
bd80: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20  protos_len += 1 
bd90: 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a  + (int) len;..}.
bda0: 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63  ../* Build the c
bdb0: 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c  omplete protocol
bdc0: 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73  -list */..protos
bdd0: 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f   = ckalloc(proto
bde0: 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74  s_len);../* prot
bdf0: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69  ocol-lists consi
be00: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67  st of 8-bit leng
be10: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74  th-prefixed, byt
be20: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f  e strings */..fo
be30: 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72  r (j = 0, p = pr
be40: 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a  otos; j < cnt; j
be50: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  ++) {..    char 
be60: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  *str = Tcl_GetSt
be70: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
be80: 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [j], &len);..   
be90: 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65   *p++ = (unsigne
bea0: 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20  d char) len;..  
beb0: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c    memcpy(p, str,
bec0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
bed0: 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09  .    p += len;..
bee0: 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61  }.../* SSL_set_a
bef0: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73  lpn_protos makes
bf00: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
bf10: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
bf20: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66  ./* Note: This f
bf30: 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73  unction reverses
bf40: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
bf50: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a  e convention */.
bf60: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70  .if (SSL_set_alp
bf70: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74  n_protos(statePt
bf80: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20  r->ssl, protos, 
bf90: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09  protos_len)) {..
bfa0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
bfb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
bfc0: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73  t ALPN protocols
bfd0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
bfe0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
bff0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
c000: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
c010: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
c020: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c  ", "IMPORT", "AL
c030: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  PN", "FAILED", (
c040: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
c050: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
c060: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
c070: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63  tatePtr);..    c
c080: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09  kfree(protos);..
c090: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c0a0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74  RROR;..}.../* St
c0b0: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  ore protocols li
c0c0: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  st */..statePtr-
c0d0: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73  >protos = protos
c0e0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
c0f0: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73  tos_len = protos
c100: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65  _len;.    } else
c110: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72   {..statePtr->pr
c120: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74  otos = NULL;..st
c130: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
c140: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  en = 0;.    }.. 
c150: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
c160: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20   Callbacks.     
c170: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61  */.    SSL_set_a
c180: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72  pp_data(statePtr
c190: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
c1a0: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69  tatePtr);./* poi
c1b0: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f  nt back to us */
c1c0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72  .    SSL_set_ver
c1d0: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ify(statePtr->ss
c1e0: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66  l, verify, Verif
c1f0: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
c200: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c  SSL_set_info_cal
c210: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c220: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63  ssl, InfoCallbac
c230: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  k);..    /* Call
c240: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69  back for observi
c250: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73  ng protocol mess
c260: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ages */.#ifndef 
c270: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
c280: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64  RACE.    /* void
c290: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
c2a0: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
c2b0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f  atePtr->ctx, (vo
c2c0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c2d0: 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58      void SSL_CTX
c2e0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c2f0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  k(statePtr->ctx,
c300: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
c310: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  ); */.    SSL_se
c320: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
c330: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  rg(statePtr->ssl
c340: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c350: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74  tr);.    SSL_set
c360: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74  _msg_callback(st
c370: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73  atePtr->ssl, Mes
c380: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23  sageCallback);.#
c390: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72  endif..    /* Cr
c3a0: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  eate Tcl_Channel
c3b0: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a   BIO Handler */.
c3c0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f      statePtr->p_
c3d0: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63  bio.= BIO_new_tc
c3e0: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f  l(statePtr, BIO_
c3f0: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74  NOCLOSE);.    st
c400: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49  atePtr->bio.= BI
c410: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28  O_new(BIO_f_ssl(
c420: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72  ));..    if (ser
c430: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65  ver) {../* Serve
c440: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09  r callbacks */..
c450: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
c460: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72  xt_servername_ar
c470: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
c480: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c490: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  r);..SSL_CTX_set
c4a0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
c4b0: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  me_callback(stat
c4c0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61  ePtr->ctx, SNICa
c4d0: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54  llback);..SSL_CT
c4e0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c  X_set_client_hel
c4f0: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  lo_cb(statePtr->
c500: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61  ctx, HelloCallba
c510: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c520: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74  ePtr);..if (stat
c530: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c540: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
c550: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65  _CTX_set_alpn_se
c560: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72  lect_cb(statePtr
c570: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62  ->ctx, ALPNCallb
c580: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c590: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55  tePtr);.#ifdef U
c5a0: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28  SE_NPN..    if (
c5b0: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c5c0: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09  ls1_3 == 0) {...
c5d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
c5e0: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73  _protos_advertis
c5f0: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ed_cb(statePtr->
c600: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b  ctx, NPNCallback
c610: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c620: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64  tr);..    }.#end
c630: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c  if..}.../* Enabl
c640: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64  e server to send
c650: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66   cert request af
c660: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54  ter handshake (T
c670: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a  LS 1.3 only) */.
c680: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72  ./* A write oper
c690: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20  ation must take 
c6a0: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65  place for the Ce
c6b0: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73  rtificate Reques
c6c0: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74  t to be..   sent
c6d0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20   to the client, 
c6e0: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65  this can be done
c6f0: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e   with SSL_do_han
c700: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66  dshake(). */..if
c710: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
c720: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74  t_handshake && t
c730: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53  ls1_3) {..    SS
c740: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f  L_verify_client_
c750: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73  post_handshake(s
c760: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
c770: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d  }.../* set autom
c780: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63  atic curve selec
c790: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74  tion */..SSL_set
c7a0: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65  _ecdh_auto(state
c7b0: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09  Ptr->ssl, 1);...
c7c0: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f  /* Set server mo
c7d0: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  de */..statePtr-
c7e0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
c7f0: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73  L_SERVER;..SSL_s
c800: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28  et_accept_state(
c810: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
c820: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
c830: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b   Client callback
c840: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  s */.#ifdef USE_
c850: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74  NPN..if (statePt
c860: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
c870: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30  L && tls1_2 == 0
c880: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
c890: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
c8a0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73  set_next_proto_s
c8b0: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74  elect_cb(statePt
c8c0: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c  r->ctx, ALPNCall
c8d0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
c8e0: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64  atePtr);..}.#end
c8f0: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  if.../* Session 
c900: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f  caching */..SSL_
c910: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f  CTX_set_session_
c920: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65  cache_mode(state
c930: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45  Ptr->ctx, SSL_SE
c940: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20  SS_CACHE_CLIENT 
c950: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  | SSL_SESS_CACHE
c960: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f  _NO_INTERNAL_STO
c970: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  RE);..SSL_CTX_se
c980: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74  ss_set_new_cb(st
c990: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73  atePtr->ctx, Ses
c9a0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  sionCallback);..
c9b0: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20  ./* Enable post 
c9c0: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e  handshake Authen
c9d0: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69  tication extensi
c9e0: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  on. TLS 1.3 only
c9f0: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f  , not http/2. */
ca00: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
ca10: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
ca20: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f   {..    SSL_set_
ca30: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61  post_handshake_a
ca40: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uth(statePtr->ss
ca50: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  l, 1);..}.../* S
ca60: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a  et client mode *
ca70: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65  /..SSL_set_conne
ca80: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  ct_state(statePt
ca90: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
caa0: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73     SSL_set_bio(s
cab0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74  tatePtr->ssl, st
cac0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73  atePtr->p_bio, s
cad0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b  tatePtr->p_bio);
cae0: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c  .    BIO_set_ssl
caf0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
cb00: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42  statePtr->ssl, B
cb10: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20  IO_NOCLOSE);..  
cb20: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20    /*.     * End 
cb30: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20  of SSL Init.    
cb40: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28   */.    dprintf(
cb50: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20  "Returning %s", 
cb60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
cb70: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
cb80: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  f));.    Tcl_Set
cb90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
cba0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43  char *) Tcl_GetC
cbb0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
cbc0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f  Ptr->self), TCL_
cbd0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20  VOLATILE);..    
cbe0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
cbf0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
cc40: 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  * UnimportObjCmd
cc50: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
cc60: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
cc70: 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ked to remove th
cc80: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
cc90: 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20  l filter.. *. * 
cca0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
ccb0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
ccc0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
ccd0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
cce0: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
ccf0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
cd00: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f  ------------. */
cd50: 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d  .static int.Unim
cd60: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  portObjCmd(Clien
cd70: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cd80: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
cd90: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
cda0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
cdb0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
cdc0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
cdd0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
cde0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
cdf0: 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63   */.    (void) c
ce00: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
ce10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
ce20: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
ce30: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
ce40: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ce50: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
ce60: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
ce70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ce80: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
ce90: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
cea0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
ceb0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
cec0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
ced0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
cee0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
cef0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cf00: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
cf10: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
cf20: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
cf30: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
cf40: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
cf50: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
cf60: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
cf70: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
cf80: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
cf90: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
cfa0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cfb0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
cfc0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
cfd0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
cfe0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
cff0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
d000: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
d010: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
d020: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e  terp, "TLS", "UN
d030: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45  IMPORT", "CHANNE
d040: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
d050: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d060: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
d080: 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e  (Tcl_UnstackChan
d090: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
d0a0: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20  ) == TCL_ERROR) 
d0b0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
d0c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
d0d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
d0e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
d0f0: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20  -----------. *. 
d130: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f  * CTX_Init -- co
d140: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54  nstruct a SSL_CT
d150: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a  X instance. *. *
d160: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76   Results:. *.A v
d170: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73  alid SSL_CTX ins
d180: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20  tance or NULL.. 
d190: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
d1a0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
d1b0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
d1c0: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
d1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a  -----------. */.
d210: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
d220: 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  .CTX_Init(State 
d230: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
d240: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
d250: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c  to, char *keyfil
d260: 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c  e, char *certfil
d270: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
d280: 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67  char *key, unsig
d290: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20  ned char *cert, 
d2a0: 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74  int key_len, int
d2b0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20   cert_len, char 
d2c0: 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61  *CApath,.    cha
d2d0: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
d2e0: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
d2f0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
d300: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
d310: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54  Hparams) {.    T
d320: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
d330: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
d340: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
d350: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
d360: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
d370: 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d  s;.    int off =
d380: 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20   0, abort = 0;. 
d390: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
d3a0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
d3b0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
d3c0: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
d3d0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
d3e0: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
d3f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d400: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
d410: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
d420: 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20  elected", (char 
d430: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d440: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
d450: 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c     /* create SSL
d460: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20   context */.#if 
d470: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
d480: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
d490: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
d4a0: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
d4b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d4c0: 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL2).    if (EN
d4d0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d4e0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a  _PROTO_SSL2)) {.
d4f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d500: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20  t(interp, "SSL2 
d510: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d520: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d530: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d540: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d550: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d560: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
d570: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d580: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL3).    if (ENA
d590: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d5a0: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09  PROTO_SSL3)) {..
d5b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d5c0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70  (interp, "SSL3 p
d5d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d5e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d5f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d600: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d610: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
d620: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
d630: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d640: 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  S1).    if (ENAB
d650: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d660: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54  ROTO_TLS1)) {..T
d670: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d680: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30  interp, "TLS 1.0
d690: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d6a0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d6b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d6c0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d6d0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d6e0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
d6f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d700: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66  O_TLS1_1).    if
d710: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d720: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d730: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
d740: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d750: 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f  "TLS 1.1 protoco
d760: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d770: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d780: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d790: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d7a0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d7b0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
d7c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
d7d0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d7e0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d7f0: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54  TO_TLS1_2)) {..T
d800: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d810: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32  interp, "TLS 1.2
d820: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d830: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d840: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d850: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d860: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d870: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
d880: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d890: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
d8a0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d8b0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d8c0: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  3)) {..Tcl_Appen
d8d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d8e0: 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f  "TLS 1.3 protoco
d8f0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d900: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d910: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d920: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
d930: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29   if (proto == 0)
d940: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20   {../* Use full 
d950: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54  range */..SSL_CT
d960: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
d970: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
d980: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
d990: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
d9a0: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ctx, 0);.    }..
d9b0: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
d9c0: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  o) {.#if OPENSSL
d9d0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
d9e0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
d9f0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
da00: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
da10: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
da20: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
da30: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64  TO_SSL2:..method
da40: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
da50: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv2_server_metho
da60: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65  d() : SSLv2_clie
da70: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
da80: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
da90: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
daa0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dab0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
dac0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dad0: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
dae0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
daf0: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
db00: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
db10: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65   SSLv3_server_me
db20: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63  thod() : SSLv3_c
db30: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
db40: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
db50: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
db60: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
db70: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
db80: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
db90: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
dba0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
dbb0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
dbc0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
dbd0: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72  r ? TLSv1_server
dbe0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
dbf0: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
dc00: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
dc10: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
dc20: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
dc30: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dc40: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
dc50: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dc60: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
dc70: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
dc80: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f  O_TLS1_1:..metho
dc90: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
dca0: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65  LSv1_1_server_me
dcb0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31  thod() : TLSv1_1
dcc0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
dcd0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
dce0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dcf0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
dd00: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dd10: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
dd20: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
dd30: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
dd40: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
dd50: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
dd60: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
dd70: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_2_server_met
dd80: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f  hod() : TLSv1_2_
dd90: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
dda0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
ddb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
ddc0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
ddd0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
dde0: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
ddf0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
de00: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65  :../* Use the ge
de10: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64  neric method and
de20: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67   constraint rang
de30: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20  e after context 
de40: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d  is created */..m
de50: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
de60: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
de70: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
de80: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
de90: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
dea0: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65   default:../* Ne
deb0: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20  gotiate highest 
dec0: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c  available SSL/TL
ded0: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65  S version */..me
dee0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
def0: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
df00: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
df10: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  nt_method();.#if
df20: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
df30: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
df40: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
df50: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
df60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
df70: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
df80: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
df90: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
dfa0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
dfb0: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
dfc0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
dfd0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
dfe0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
dff0: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
e000: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e010: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
e020: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
e030: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
e040: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e050: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
e060: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
e070: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
e080: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e090: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
e0a0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
e0b0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
e0c0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
e0d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e0e0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
e0f0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
e100: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e110: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
e120: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
e130: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
e140: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
e150: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
e160: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
e170: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
e180: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e190: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
e1a0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
e1b0: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
e1c0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e1d0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
e1e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e1f0: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
e200: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e210: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
e220: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
e230: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
e240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e250: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
e260: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20  r();..    ctx = 
e270: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
e280: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74  od);.    if (!ct
e290: 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  x) {..return NUL
e2a0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
e2b0: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c   (getenv(SSLKEYL
e2c0: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f  OGFILE)) {..SSL_
e2d0: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63  CTX_set_keylog_c
e2e0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79  allback(ctx, Key
e2f0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  LogCallback);.  
e300: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
e310: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
e320: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e330: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
e340: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53  if (proto == TLS
e350: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b  _PROTO_TLS1_3) {
e360: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
e370: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
e380: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
e390: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
e3a0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
e3b0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
e3c0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d  _VERSION);.    }
e3d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
e3e0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c  Force cipher sel
e3f0: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20  ection order by 
e400: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66  server */.    if
e410: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09   (!isServer) {..
e420: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
e430: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
e440: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52  CIPHER_SERVER_PR
e450: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d  EFERENCE);.    }
e460: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
e470: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
e480: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f  x10100000L.    O
e490: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61  penSSL_add_all_a
e4a0: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20  lgorithms(); /* 
e4b0: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64  Load ciphers and
e4c0: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64   digests */.#end
e4d0: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  if..    SSL_CTX_
e4e0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78  set_app_data(ctx
e4f0: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29  , (void*)interp)
e500: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68  ;./* remember th
e510: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  e interpreter */
e520: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e530: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
e540: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c  L_OP_ALL);./* al
e550: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
e560: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
e570: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e580: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  (ctx, SSL_OP_NO_
e590: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a  COMPRESSION);./*
e5a0: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73   disable compres
e5b0: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70  sion even if sup
e5c0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53  ported */.    SS
e5d0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
e5e0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a  s(ctx, off);../*
e5f0: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f   disable protoco
e600: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69  l versions */.#i
e610: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
e620: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
e630: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43  01000L.    SSL_C
e640: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c  TX_set_mode(ctx,
e650: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52   SSL_MODE_AUTO_R
e660: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65  ETRY);./* handle
e670: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20   new handshakes 
e680: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f  in background. O
e690: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20  n by default in 
e6a0: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a  OpenSSL 1.1.1. *
e6b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c  /.#endif.    SSL
e6c0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61  _CTX_sess_set_ca
e6d0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32  che_size(ctx, 12
e6e0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  8);..    /* Set 
e6f0: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70  user defined cip
e700: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69  hers, cipher sui
e710: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74  tes, and securit
e720: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
e730: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e  f ((ciphers != N
e740: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58  ULL) && !SSL_CTX
e750: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74  _set_cipher_list
e760: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20  (ctx, ciphers)) 
e770: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e780: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
e790: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a   ciphers failed:
e7a0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
e7b0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
e7c0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
e7d0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
e7e0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
e7f0: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65  if ((ciphersuite
e800: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
e810: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
e820: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70  rsuites(ctx, cip
e830: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54  hersuites)) {..T
e840: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e850: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
e860: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65  her suites faile
e870: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
e880: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
e890: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
e8a0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
e8b0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
e8c0: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69     /* Set securi
e8d0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
e8e0: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26  if (level > -1 &
e8f0: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09  & level < 6) {..
e900: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72  /* SSL_set_secur
e910: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53  ity_level */..SS
e920: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69  L_CTX_set_securi
e930: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65  ty_level(ctx, le
e940: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  vel);.    }..   
e950: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
e960: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
e970: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e980: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
e990: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
e9a0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
e9b0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
e9c0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
e9d0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
e9e0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72  ePtr);..    /* r
e9f0: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c  ead a Diffie-Hel
ea00: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lman parameters 
ea10: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65  file, or use the
ea20: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f   built-in one */
ea30: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ea40: 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65  Init(&ds);.#ifde
ea50: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a  f OPENSSL_NO_DH.
ea60: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
ea70: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
ea80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ea90: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65  terp, "DH parame
eaa0: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20  ter support not 
eab0: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61  available", (cha
eac0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
ead0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
eae0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
eaf0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a    }.#else.    {.
eb00: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48  .DH* dh;..if (DH
eb10: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
eb20: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  {..    BIO *bio;
eb30: 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f  ...    bio = BIO
eb40: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48  _new_file(F2N(DH
eb50: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72  params, &ds), "r
eb60: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69  ");..    if (!bi
eb70: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  o) {...Tcl_DStri
eb80: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54  ngFree(&ds);...T
eb90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
eba0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
ebb0: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
ebc0: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
ebd0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
ebe0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ebf0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
ec00: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68  ..    }...    dh
ec10: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f   = PEM_read_bio_
ec20: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55  DHparams(bio, NU
ec30: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
ec40: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
ec50: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  io);..    Tcl_DS
ec60: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
ec70: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a  .    if (!dh) {.
ec80: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
ec90: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
eca0: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61  d not read DH pa
ecb0: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69  rameters from fi
ecc0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
ecd0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ece0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ecf0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ed00: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
ed10: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29  _tmp_dh(ctx, dh)
ed20: 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64  ;..    DH_free(d
ed30: 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  h);...} else {..
ed40: 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20      /* Use well 
ed50: 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74  known DH paramet
ed60: 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75  ers that have bu
ed70: 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69  ilt-in support i
ed80: 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20  n OpenSSL */..  
ed90: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73    if (!SSL_CTX_s
eda0: 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20  et_dh_auto(ctx, 
edb0: 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  1)) {...Tcl_Appe
edc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
edd0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62   "Could not enab
ede0: 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20  le set DH auto: 
edf0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
ee00: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ee10: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ee20: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ee30: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ee40: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
ee50: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
ee60: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20  certificate */. 
ee70: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f     load_private_
ee80: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20  key = 0;.    if 
ee90: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c  (certfile != NUL
eea0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
eeb0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66  te_key = 1;...if
eec0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
eed0: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63  rtificate_file(c
eee0: 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65  tx, F2N(certfile
eef0: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45  , &ds), SSL_FILE
ef00: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
ef10: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
ef20: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
ef30: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ef40: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
ef50: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66  le to set certif
ef60: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
ef70: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
ef80: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
ef90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
efa0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
efb0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
efc0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09  eturn NULL;..}..
efd0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
efe0: 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  &ds);..    } els
eff0: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
f000: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
f010: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
f020: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
f030: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
f040: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
f050: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
f060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f070: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f080: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
f090: 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45  cate: ",...GET_E
f0a0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
f0b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
f0c0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
f0d0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
f0e0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
f0f0: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65  else {..certfile
f100: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67   = (char*)X509_g
f110: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f  et_default_cert_
f120: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53  file();...if (SS
f130: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
f140: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
f150: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49  certfile, SSL_FI
f160: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
f170: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54  ) {.#if 0..    T
f180: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f190: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
f1a0: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63  to use default c
f1b0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
f1c0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
f1d0: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
f1e0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f1f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
f200: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f210: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
f220: 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d  .#endif..}.    }
f230: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
f240: 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a   private key */.
f250: 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69      if (load_pri
f260: 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20  vate_key) {..if 
f270: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
f280: 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29   && key == NULL)
f290: 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20   {..    keyfile 
f2a0: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a  = certfile;..}..
f2b0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20  .if (keyfile != 
f2c0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20  NULL) {..    /* 
f2d0: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20  get the private 
f2e0: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
f2f0: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69  ith this certifi
f300: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20  cate */..    if 
f310: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
f320: 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20  ) {...keyfile = 
f330: 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d  certfile;..    }
f340: 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  ...    if (SSL_C
f350: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
f360: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
f370: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  keyfile, &ds), S
f380: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
f390: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44   <= 0) {...Tcl_D
f3a0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f3b0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
f3c0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
f3d0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
f3e0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
f3f0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
f400: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
f410: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
f420: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f430: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
f440: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20   set public key 
f450: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c  file ", keyfile,
f460: 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f   " ",...    GET_
f470: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
f480: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
f490: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f4a0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
f4b0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
f4c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f4d0: 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20  s);...} else if 
f4e0: 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (key != NULL) {.
f4f0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
f500: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
f510: 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53  ASN1(EVP_PKEY_RS
f520: 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f  A, ctx, key,key_
f530: 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f  len) <= 0) {.../
f540: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
f550: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
f560: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
f570: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
f580: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
f590: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
f5a0: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
f5b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f5c0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f5d0: 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20   public key: ", 
f5e0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
f5f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f600: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
f610: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
f620: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
f630: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
f640: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
f650: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
f660: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
f670: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
f680: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
f690: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
f6a0: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
f6b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f6c0: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
f6d0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
f6e0: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
f6f0: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
f700: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
f710: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
f720: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f730: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
f740: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
f750: 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64 65  /* Set to use de
f760: 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61  fault location a
f770: 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74  nd file for Cert
f780: 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74  ificate Authorit
f790: 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61  y (CA) certifica
f7a0: 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20  tes. The.     * 
f7b0: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20  verify path and 
f7c0: 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65  store can be ove
f7d0: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
f7e0: 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20  SL_CERT_DIR env 
f7f0: 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79 20  var. The verify 
f800: 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20  file can.     * 
f810: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
f820: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49   the SSL_CERT_FI
f830: 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20  LE env var. */. 
f840: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
f850: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69  set_default_veri
f860: 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b  fy_paths(ctx)) {
f870: 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d  ..abort++;.    }
f880: 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64  ..    /* Overrid
f890: 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76 65  es for the CA ve
f8a0: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66 69  rify path and fi
f8b0: 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20  le */.    {.#if 
f8c0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
f8d0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
f8e0: 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68  000L..if (CApath
f8f0: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69   != NULL || CAfi
f900: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
f910: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
f920: 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  s1;..    Tcl_DSt
f930: 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a  ringInit(&ds1);.
f940: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
f950: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c  TX_load_verify_l
f960: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32  ocations(ctx, F2
f970: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20  N(CAfile, &ds), 
f980: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31  F2N(CApath, &ds1
f990: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b  ))) {...abort++;
f9a0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
f9b0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f9c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
f9d0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a  ingFree(&ds1);..
f9e0: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
f9f0: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
fa00: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
fa10: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
fa20: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
fa30: 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  /..    /* https:
fa40: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
fa50: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
fa60: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a   */..    /* XXX:
fa70: 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
fa80: 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
fa90: 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
faa0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
fab0: 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
fac0: 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20  lesystem */..   
fad0: 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
fae0: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
faf0: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
fb00: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
fb10: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
fb20: 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
fb30: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
fb40: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
fb50: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
fb60: 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
fb70: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
fb80: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23  Free(&ds);..}..#
fb90: 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74 68  else..if (CApath
fba0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
fbb0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
fbc0: 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74  ad_verify_dir(ct
fbd0: 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26  x, F2N(CApath, &
fbe0: 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b  ds))) {...abort+
fbf0: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  +;..    }..    T
fc00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
fc10: 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66  ds);..}..if (CAf
fc20: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
fc30: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
fc40: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c  _load_verify_fil
fc50: 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  e(ctx, F2N(CAfil
fc60: 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62  e, &ds))) {...ab
fc70: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
fc80: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
fc90: 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f  ee(&ds);...    /
fca0: 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41  * Set list of CA
fcb0: 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69  s to send to cli
fcc0: 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74  ent when request
fcd0: 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72  ing a client cer
fce0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
fcf0: 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
fd00: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
fd10: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
fd20: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
fd30: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
fd40: 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
fd50: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
fd60: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
fd70: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
fd80: 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
fd90: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
fda0: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65  Free(&ds);..}.#e
fdb0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
fdc0: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
fdd0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
fde0: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 53  --------. *. * S
fe20: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
fe30: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
fe40: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
fe50: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  peer.. *. * Resu
fe60: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
fe70: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
fe80: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
fe90: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
fea0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
feb0: 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
fef0: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64  int.StatusObjCmd
ff00: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
ff10: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
ff20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
ff30: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
ff40: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
ff50: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
ff60: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65  tr;.    X509 *pe
ff70: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  er;.    Tcl_Obj 
ff80: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c  *objPtr;.    Tcl
ff90: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
ffa0: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c     char *channel
ffb0: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a  Name, *ciphers;.
ffc0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
ffd0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
ffe0: 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20   char *proto;.  
fff0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c    unsigned int l
10000 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c  en;.    int nid,
10010 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29   res;.    (void)
10020 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
10030 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
10040 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
10050 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 2 || objc >
10060 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33   3 || (objc == 3
10070 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f   && !strcmp(Tcl_
10080 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10090 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20  ]), "-local"))) 
100a0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
100b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
100c0 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63  bjv, "?-local? c
100d0 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
100e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
100f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
10100 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20  hannel Id */.   
10110 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54   channelName = T
10120 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10130 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31  v[(objc == 2 ? 1
10140 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61   : 2)]);.    cha
10150 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
10160 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
10170 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a  elName, &mode);.
10180 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
10190 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
101a0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
101b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
101c0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
101d0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
101e0 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
101f0 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
10200 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
10210 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
10220 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
10230 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
10240 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
10250 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
10260 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
10270 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
10280 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
10290 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
102a0 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
102b0 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  l", (char *) NUL
102c0 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
102d0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
102e0 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
102f0 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
10300 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
10310 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
10320 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10330 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
10340 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
10350 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
10360 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  a(chan);..    /*
10370 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65   Get certificate
10380 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c   for peer or sel
10390 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  f */.    if (obj
103a0 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20  c == 2) {..peer 
103b0 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63  = SSL_get_peer_c
103c0 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
103d0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
103e0 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20   else {..peer = 
103f0 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63  SSL_get_certific
10400 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
10410 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  l);.    }.    /*
10420 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66   Get X509 certif
10430 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  icate info */.  
10440 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
10450 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
10460 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
10470 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
10480 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30  == 2) {..    X50
10490 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20  9_free(peer);.. 
104a0 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a     peer = NULL;.
104b0 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
104c0 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
104d0 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
104e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
104f0 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
10500 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10510 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10520 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  eername", SSL_ge
10530 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
10540 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
10550 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
10560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10570 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65   "sbits", SSL_ge
10580 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74  t_cipher_bits(st
10590 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c  atePtr->ssl, NUL
105a0 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  L));..    cipher
105b0 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
105c0 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
105d0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41  tr->ssl);.    LA
105e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
105f0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
10600 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29  r", ciphers, -1)
10610 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
10620 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
10630 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
10640 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
10650 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10660 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10670 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09  verifyResult",..
10680 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
10690 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
106a0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
106b0 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
106c0 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  l)), -1);..    /
106d0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f  * Verify mode */
106e0 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  .    mode = SSL_
106f0 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28  get_verify_mode(
10700 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10710 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20      if (mode && 
10720 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
10730 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
10740 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10750 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
10760 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
10770 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
10780 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
10790 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
107a0 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
107b0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
107c0 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
107d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
107e0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
107f0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
10800 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
10810 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
10820 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10830 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
10840 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
10850 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10860 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10870 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10880 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10890 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
108a0 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
108b0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
108c0 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
108d0 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
108e0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
108f0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10900 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10910 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
10920 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
10930 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10940 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
10950 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
10960 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10970 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10980 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10990 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
109a0 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
109b0 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
109c0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
109d0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
109e0 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
109f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
10a00 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
10a10 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10a20 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10a30 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
10a40 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
10a50 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
10a60 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
10a70 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
10a80 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
10a90 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10aa0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
10ab0 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
10ac0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
10ad0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
10ae0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
10af0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10b00 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
10b10 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
10b20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
10b30 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10b40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10b50 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
10b60 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
10b70 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
10b80 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
10b90 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
10ba0 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
10bb0 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
10bc0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
10bd0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
10be0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10bf0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10c00 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10c10 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
10c20 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10c30 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10c50 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
10c60 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10c70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10c80 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
10c90 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
10ca0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
10cb0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ..    if (objc =
10cc0 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
10cd0 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
10ce0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
10cf0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10d00 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
10d10 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
10d20 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
10d30 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
10d40 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
10d50 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
10d60 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
10d70 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10d80 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
10d90 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
10da0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a  2ln(nid), -1);..
10db0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
10dc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
10dd0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
10de0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
10df0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e30 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
10e40 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
10e50 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
10e60 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
10e70 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
10e80 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
10e90 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
10ea0 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
10eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10ef0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
10f00 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
10f10 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
10f20 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
10f30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
10f40 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
10f50 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
10f60 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
10f70 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
10f80 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
10f90 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20   mode on */.    
10fa0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
10fb0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
10fc0 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
10fd0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
10fe0 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
10ff0 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
11000 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
11010 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
11020 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
11030 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
11040 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ion;.    const E
11050 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28  VP_MD *md;.    (
11060 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
11070 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
11080 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
11090 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
110a0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
110b0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
110c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
110d0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
110e0 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
110f0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11100 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
11110 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
11120 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
11130 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
11140 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11150 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
11160 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
11170 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
11180 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
11190 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
111a0 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
111b0 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
111c0 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
111d0 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
111e0 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
111f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11200 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
11210 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
11220 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
11230 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
11240 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
11250 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
11260 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
11270 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45  p, "TLS", "CONNE
11280 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c  CTION", "CHANNEL
11290 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
112a0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
112b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
112c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
112d0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
112e0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
112f0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
11300 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61   info */.    sta
11310 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
11320 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
11330 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
11340 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61  );.    ssl = sta
11350 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20  tePtr->ssl;.    
11360 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
11370 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f   {../* connectio
11380 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50  n state */..LAPP
11390 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
113a0 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c  objPtr, "state",
113b0 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
113c0 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
113d0 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
113e0 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
113f0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
11400 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11410 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65  Ptr, "servername
11420 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  ", SSL_get_serve
11430 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
11440 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
11450 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  name), -1);.../*
11460 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f   Get protocol */
11470 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11480 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
11490 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
114a0 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20  t_version(ssl), 
114b0 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f  -1);.../* Renego
114c0 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20  tiation allowed 
114d0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
114e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
114f0 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f   "renegotiation_
11500 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65  allowed", SSL_ge
11510 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74  t_secure_renegot
11520 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28  iation_support((
11530 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09  SSL *) ssl));...
11540 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20  /* Get security 
11550 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  level */..LAPPEN
11560 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
11570 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f  jPtr, "security_
11580 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  level", SSL_get_
11590 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73  security_level(s
115a0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  sl));.../* Sessi
115b0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50  on info */..LAPP
115c0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
115d0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
115e0 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73  n_reused", SSL_s
115f0 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73  ession_reused(ss
11600 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72  l));.../* Is ser
11610 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ver info */..LAP
11620 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11630 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65  , objPtr, "is_se
11640 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65  rver", SSL_is_se
11650 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  rver(ssl));.../*
11660 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50   Is DTLS */..LAP
11670 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11680 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74  , objPtr, "is_dt
11690 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73  ls", SSL_is_dtls
116a0 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  (ssl));.    }.. 
116b0 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66     /* Cipher inf
116c0 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20  o */.    cipher 
116d0 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
116e0 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20  t_cipher(ssl);. 
116f0 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d     if (cipher !=
11700 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62   NULL) {..char b
11710 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d  uf[BUFSIZ] = {0}
11720 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67  ;..int bits, alg
11730 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68  _bits;.../* Ciph
11740 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
11750 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11760 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
11770 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  , SSL_CIPHER_get
11780 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
11790 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d  1);.../* RFC nam
117a0 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09  e of cipher */..
117b0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
117c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
117d0 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c  ndard_name", SSL
117e0 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
117f0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
11800 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c  1);.../* OpenSSL
11810 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
11820 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11830 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11840 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20  "openssl_name", 
11850 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e  OPENSSL_cipher_n
11860 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73  ame(SSL_CIPHER_s
11870 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
11880 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
11890 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65   number of secre
118a0 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20  t bits used for 
118b0 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20  cipher */..bits 
118c0 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  = SSL_CIPHER_get
118d0 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61  _bits(cipher, &a
118e0 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  lg_bits);..LAPPE
118f0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11900 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62  bjPtr, "secret_b
11910 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41  its", bits);..LA
11920 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11930 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72  , objPtr, "algor
11940 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f  ithm_bits", alg_
11950 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62  bits);../* alg_b
11960 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65  its is actual ke
11970 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49  y secret bits. I
11980 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73  f use bits and s
11990 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d  ecret (algorithm
119a0 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09  ) bits differ,..
119b0 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74     the rest of t
119c0 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65  he bits are fixe
119d0 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69  d, i.e. for limi
119e0 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65  ted export ciphe
119f0 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a  rs (bits < 56) *
11a00 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73  /.../* Indicates
11a10 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70   which SSL/TLS p
11a20 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20  rotocol version 
11a30 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68  first defined th
11a40 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  e cipher */..LAP
11a50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11a60 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65   objPtr, "min_ve
11a70 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48  rsion", SSL_CIPH
11a80 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
11a90 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f  ipher), -1);.../
11aa0 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a  * Cipher NID */.
11ab0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11ac0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
11ad0 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20  pherNID", (char 
11ae0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
11af0 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68  _CIPHER_get_ciph
11b00 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  er_nid(cipher)),
11b10 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
11b20 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11b30 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20  r, "digestNID", 
11b40 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
11b50 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
11b60 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70  t_digest_nid(cip
11b70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
11b80 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11b90 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63   objPtr, "keyExc
11ba0 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72  hangeNID", (char
11bb0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
11bc0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f  L_CIPHER_get_kx_
11bd0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11be0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11bf0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11c00 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e  "authenticationN
11c10 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
11c20 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
11c30 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28  ER_get_auth_nid(
11c40 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a  cipher)), -1);..
11c50 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68  ./* message auth
11c60 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
11c70 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44  - Cipher is AEAD
11c80 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68   (e.g. GCM or Ch
11c90 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29  aCha20/Poly1305)
11ca0 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41   or not */../* A
11cb0 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63  uthenticated Enc
11cc0 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73  ryption with ass
11cd0 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45  ociated data (AE
11ce0 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41  AD) check */..LA
11cf0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11d00 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
11d10 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c  er_is_aead", SSL
11d20 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28  _CIPHER_is_aead(
11d30 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44  cipher));.../* D
11d40 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e  igest used durin
11d50 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61  g the SSL/TLS ha
11d60 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69  ndshake when usi
11d70 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a  ng the cipher. *
11d80 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48  /..md = SSL_CIPH
11d90 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65  ER_get_handshake
11da0 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b  _digest(cipher);
11db0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11dc0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68  terp, objPtr, "h
11dd0 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22  andshake_digest"
11de0 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44  , (char *)EVP_MD
11df0 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a  _name(md), -1);.
11e00 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c  ../* Get OpenSSL
11e10 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f  -specific ID, no
11e20 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41  t IANA ID */..LA
11e30 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11e40 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11e50 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  r_id", (int) SSL
11e60 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
11e70 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77  ipher));.../* Tw
11e80 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69  o-byte ID used i
11e90 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63  n the TLS protoc
11ea0 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ol of the given 
11eb0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11ec0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11ed0 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
11ee0 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
11ef0 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f  CIPHER_get_proto
11f00 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b  col_id(cipher));
11f10 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65  .../* Textual de
11f20 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
11f30 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28   cipher */..if (
11f40 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
11f50 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62  iption(cipher, b
11f60 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
11f70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
11f80 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11f90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65  erp, objPtr, "de
11fa0 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c  scription", buf,
11fb0 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a   -1);..}.    }..
11fc0 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
11fd0 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  nfo */.    sessi
11fe0 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73  on = SSL_get_ses
11ff0 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69  sion(ssl);.    i
12000 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55  f (session != NU
12010 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
12020 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
12030 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32  et;..size_t len2
12040 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
12050 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73  ulen;..const uns
12060 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
12070 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a  ion_id, *proto;.
12080 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
12090 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41  uffer[SSL_MAX_MA
120a0 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d  STER_KEY_LENGTH]
120b0 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
120c0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
120d0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
120e0 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f  of the ALPN nego
120f0 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  tiation */..SSL_
12100 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70  SESSION_get0_alp
12110 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69  n_selected(sessi
12120 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  on, &proto, &len
12130 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  2);..LAPPEND_STR
12140 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12150 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
12160 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  ) proto, (Tcl_Si
12170 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
12180 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
12190 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
121a0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
121b0 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
121c0 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
121d0 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
121e0 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
121f0 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
12200 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
12210 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12220 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72  tr, "npn", (char
12230 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
12240 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e  Size) ulen);.#en
12250 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62  dif.../* Resumab
12260 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c  le session */..L
12270 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12280 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73  rp, objPtr, "res
12290 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53  umable", SSL_SES
122a0 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c  SION_is_resumabl
122b0 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  e(session));.../
122c0 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20  * Session start 
122d0 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69  time (seconds si
122e0 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c  nce epoch) */..L
122f0 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
12300 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
12310 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  rt_time", SSL_SE
12320 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73  SSION_get_time(s
12330 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
12340 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53  imeout value - S
12350 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f  SL_CTX_get_timeo
12360 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  ut (in seconds) 
12370 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
12380 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12390 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f   "timeout", SSL_
123a0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
123b0 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  out(session));..
123c0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d  ./* Session id -
123d0 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c   TLSv1.2 and bel
123e0 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73  ow only */..sess
123f0 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
12400 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
12410 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
12420 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
12430 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
12440 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69  ssion_id", sessi
12450 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
12460 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65  ) ulen);.../* Se
12470 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ssion context */
12480 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53  ..session_id = S
12490 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
124a0 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69  id_context(sessi
124b0 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
124c0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
124d0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
124e0 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73  sion_context", s
124f0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
12500 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
12510 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
12520 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a   - client only *
12530 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
12540 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
12550 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
12560 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
12570 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
12580 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69  Ptr, "session_ti
12590 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28  cket", ticket, (
125a0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
125b0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
125c0 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69  cket lifetime hi
125d0 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  nt (in seconds) 
125e0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
125f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12600 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c   "lifetime", SSL
12610 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
12620 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
12630 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  t(session));.../
12640 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
12650 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  a */.#if OPENSSL
12660 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
12670 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53  < 0x30000000L..S
12680 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
12690 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28  ticket_appdata((
126a0 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73  SSL_SESSION *) s
126b0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
126c0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
126d0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
126e0 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74   objPtr, "ticket
126f0 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b  _app_data", tick
12700 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
12710 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f  en2);.#endif.../
12720 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79  * Get master key
12730 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f   */..len2 = SSL_
12740 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74  SESSION_get_mast
12750 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20  er_key(session, 
12760 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f  buffer, SSL_MAX_
12770 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
12780 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  H);..LAPPEND_BAR
12790 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
127a0 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22  tr, "master_key"
127b0 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53  , buffer, (Tcl_S
127c0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
127d0 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20   Compression id 
127e0 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  */..unsigned int
127f0 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f   id = SSL_SESSIO
12800 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69  N_get_compress_i
12810 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50  d(session);..LAP
12820 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12830 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
12840 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d  ssion_id", id ==
12850 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e   1 ? "zlib" : "n
12860 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
12870 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73  ..    /* Compres
12880 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
12890 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c   if (ssl != NULL
128a0 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ) {.#ifdef HAVE_
128b0 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a  SSL_COMPRESSION.
128c0 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48  .const COMP_METH
128d0 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b  OD *comp, *expn;
128e0 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74  ..comp = SSL_get
128f0 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73  _current_compres
12900 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e  sion(ssl);..expn
12910 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
12920 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c  nt_expansion(ssl
12930 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  );...LAPPEND_STR
12940 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12950 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
12960 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  comp ? SSL_COMP_
12970 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a  get_name(comp) :
12980 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c   "none", -1);..L
12990 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
129a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61  p, objPtr, "expa
129b0 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53  nsion", expn ? S
129c0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
129d0 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c  (expn) : "none",
129e0 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50   -1);.#else..LAP
129f0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12a00 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
12a10 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20  ssion", "none", 
12a20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
12a30 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12a40 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22  , "expansion", "
12a50 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64  none", -1);.#end
12a60 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
12a70 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   Server info */.
12a80 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65      {..long mode
12a90 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73   = SSL_CTX_get_s
12aa0 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
12ab0 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
12ac0 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09  ;..char *msg;...
12ad0 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
12ae0 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b  ESS_CACHE_OFF) {
12af0 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66  ..    msg = "off
12b00 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12b10 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12b20 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09  ACHE_CLIENT) {..
12b30 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e      msg = "clien
12b40 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  t";..} else if (
12b50 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
12b60 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a  CACHE_SERVER) {.
12b70 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76  .    msg = "serv
12b80 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  er";..} else if 
12b90 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
12ba0 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09  _CACHE_BOTH) {..
12bb0 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22      msg = "both"
12bc0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
12bd0 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22   msg = "unknown"
12be0 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54  ;..}..LAPPEND_ST
12bf0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12c00 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  , "session_cache
12c10 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29  _mode", msg, -1)
12c20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12c30 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f  CA List */.    /
12c40 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65  * IF not a serve
12c50 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67  r, same as SSL_g
12c60 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74  et0_peer_CA_list
12c70 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65  . If server same
12c80 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f   as SSL_CTX_get_
12c90 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a  client_CA_list *
12ca0 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20  /.    listPtr = 
12cb0 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
12cc0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41  , NULL);.    STA
12cd0 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
12ce0 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69   *ca_list;.    i
12cf0 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53  f ((ca_list = SS
12d00 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  L_get_client_CA_
12d10 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55  list(ssl)) != NU
12d20 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66  LL) {..char buff
12d30 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72  er[BUFSIZ];..for
12d40 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
12d50 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
12d60 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29  m(ca_list); i++)
12d70 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d   {..    X509_NAM
12d80 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30  E *name = sk_X50
12d90 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f  9_NAME_value(ca_
12da0 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69  list, i);..    i
12db0 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30  f (name) {...X50
12dc0 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e  9_NAME_oneline(n
12dd0 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46  ame, buffer, BUF
12de0 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  SIZ);...Tcl_List
12df0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12e00 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
12e10 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12e20 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
12e30 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
12e40 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
12e50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12e60 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50   "caList", listP
12e70 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  tr);.    LAPPEND
12e80 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
12e90 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e  Ptr, "caListCoun
12ea0 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  t", sk_X509_NAME
12eb0 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a  _num(ca_list));.
12ec0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
12ed0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
12ee0 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
12ef0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
12f00 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f40 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
12f50 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  sionObjCmd -- re
12f60 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72  turn version str
12f70 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  ing from OpenSSL
12f80 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
12f90 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
12fa0 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
12fb0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
12fc0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13010 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
13020 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c  VersionObjCmd(Cl
13030 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
13040 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
13050 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
13060 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
13070 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
13080 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
13090 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
130a0 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69  ntData;.    (voi
130b0 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f  d) objc;.    (vo
130c0 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64  id) objv;..    d
130d0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
130e0 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
130f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13100 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e  (OPENSSL_VERSION
13110 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20  _TEXT, -1);.    
13120 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
13130 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
13140 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
13150 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131a0 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a  --. *. * MiscObj
131b0 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d  Cmd -- misc comm
131c0 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ands. *. * Resul
131d0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
131e0 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
131f0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
13200 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
13210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13250 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
13260 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c  nt.MiscObjCmd(Cl
13270 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
13280 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
13290 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
132a0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
132b0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
132c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
132d0 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d  r *commands [] =
132e0 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65   { "req", "strre
132f0 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20  q", NULL };.    
13300 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43  enum command { C
13310 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20  _REQ, C_STRREQ, 
13320 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54  C_DUMMY };.    T
13330 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20  cl_Size cmd;.   
13340 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20   int isStr;.    
13350 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38  char buffer[1638
13360 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  4];.    (void) c
13370 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
13380 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
13390 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
133a0 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
133b0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
133c0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
133d0 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
133e0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
133f0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
13400 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
13410 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13420 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
13430 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26   "command", 0, &
13440 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  cmd) != TCL_OK) 
13450 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
13460 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
13470 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
13480 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20  );..    isStr = 
13490 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51  (cmd == C_STRREQ
134a0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  );.    switch ((
134b0 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d  enum command) cm
134c0 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51  d) {..case C_REQ
134d0 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51  :..case C_STRREQ
134e0 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  : {..    EVP_PKE
134f0 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20  Y *pkey=NULL;.. 
13500 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55     X509 *cert=NU
13510 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  LL;..    X509_NA
13520 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09  ME *name=NULL;..
13530 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69      Tcl_Obj **li
13540 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69  stv;..    Tcl_Si
13550 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69  ze listc;..    i
13560 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20  nt i;...    BIO 
13570 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20  *out=NULL;...   
13580 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b   char *k_C="",*k
13590 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a  _ST="",*k_L="",*
135a0 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c  k_O="",*k_OU="",
135b0 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69  *k_CN="",*k_Emai
135c0 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20  l="";..    char 
135d0 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c  *keyout,*pemout,
135e0 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b  *str;..    int k
135f0 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c  eysize,serial=0,
13600 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f  days=365;..#if O
13610 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
13620 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
13630 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20  00L..    BIGNUM 
13640 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  *bne = NULL;..  
13650 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c    RSA *rsa = NUL
13660 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56  L;.#else..    EV
13670 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20  P_PKEY_CTX *ctx 
13680 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
13690 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35  .    if ((objc<5
136a0 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b  ) || (objc>6)) {
136b0 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ...Tcl_WrongNumA
136c0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
136d0 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65  bjv, "keysize ke
136e0 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f  yfile certfile ?
136f0 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72  info?");...retur
13700 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
13710 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63    }...    if (Tc
13720 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13730 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
13740 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43   &keysize) != TC
13750 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
13760 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
13770 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54   }..    keyout=T
13780 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13790 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f  v[3]);..    pemo
137a0 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
137b0 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20  (objv[4]);..    
137c0 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54  if (isStr) {...T
137d0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
137e0 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,keyout,"",0);..
137f0 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13800 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b  rp,pemout,"",0);
13810 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
13820 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69   (objc>=6) {...i
13830 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
13840 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
13850 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74  , objv[5], &list
13860 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43  c, &listv) != TC
13870 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65  L_OK) {...    re
13880 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13890 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74  ..}....if ((list
138a0 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20  c%2) != 0) {... 
138b0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
138c0 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61  (interp,"Informa
138d0 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68  tion list must h
138e0 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20  ave even number 
138f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55  of arguments",NU
13900 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
13910 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
13920 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c  ...for (i=0; i<l
13930 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09  istc; i+=2) {...
13940 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53      str=Tcl_GetS
13950 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b  tring(listv[i]);
13960 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d  ...    if (strcm
13970 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30  p(str,"days")==0
13980 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
13990 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
139a0 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
139b0 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09  days)!=TCL_OK)..
139c0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
139d0 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20  _ERROR;...    } 
139e0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
139f0 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30  str,"serial")==0
13a00 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
13a10 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13a20 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
13a30 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29  serial)!=TCL_OK)
13a40 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
13a50 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
13a60 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13a70 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b  p(str,"C")==0) {
13a80 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53  ....k_C=Tcl_GetS
13a90 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13aa0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13ab0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13ac0 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  ST")==0) {....k_
13ad0 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ST=Tcl_GetString
13ae0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13af0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13b00 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d  trcmp(str,"L")==
13b10 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f  0) {....k_L=Tcl_
13b20 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13b30 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13b40 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13b50 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"O")==0) {...
13b60 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_O=Tcl_GetStri
13b70 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13b80 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13b90 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22  (strcmp(str,"OU"
13ba0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d  )==0) {....k_OU=
13bb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13bc0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13bd0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13be0 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29  mp(str,"CN")==0)
13bf0 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47   {....k_CN=Tcl_G
13c00 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13c10 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13c20 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13c30 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b  r,"Email")==0) {
13c40 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f  ....k_Email=Tcl_
13c50 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13c60 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13c70 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74  lse {....Tcl_Set
13c80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55  Result(interp,"U
13c90 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72  nknown parameter
13ca0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75  ",NULL);....retu
13cb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
13cc0 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d      }...}..    }
13cd0 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13ce0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13cf0 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13d00 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a  bne = BN_new();.
13d10 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e  .    rsa = RSA_n
13d20 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20  ew();..    pkey 
13d30 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29  = EVP_PKEY_new()
13d40 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d  ;..    if (bne =
13d50 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d  = NULL || rsa ==
13d60 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d   NULL || pkey ==
13d70 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74   NULL || !BN_set
13d80 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34  _word(bne,RSA_F4
13d90 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65  ) ||...!RSA_gene
13da0 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c  rate_key_ex(rsa,
13db0 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e   keysize, bne, N
13dc0 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45  ULL) || !EVP_PKE
13dd0 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65  Y_assign_RSA(pke
13de0 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50  y, rsa)) {...EVP
13df0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
13e00 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28  ;.../* RSA_free(
13e10 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45  rsa); freed by E
13e20 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a  VP_PKEY_free */.
13e30 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
13e40 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20  #else..    pkey 
13e50 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75  = EVP_RSA_gen((u
13e60 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79  nsigned int) key
13e70 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20  size);..    ctx 
13e80 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e  = EVP_PKEY_CTX_n
13e90 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09  ew(pkey,NULL);..
13ea0 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20      if (pkey == 
13eb0 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e  NULL || ctx == N
13ec0 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ULL || !EVP_PKEY
13ed0 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78  _keygen_init(ctx
13ee0 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59  ) ||...!EVP_PKEY
13ef0 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79  _CTX_set_rsa_key
13f00 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65  gen_bits(ctx, ke
13f10 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50  ysize) || !EVP_P
13f20 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20  KEY_keygen(ctx, 
13f30 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f  &pkey)) {...EVP_
13f40 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
13f50 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ...EVP_PKEY_CTX_
13f60 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69  free(ctx);.#endi
13f70 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  f...Tcl_SetResul
13f80 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
13f90 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
13fa0 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
13fb0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13fc0 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  R;..    } else {
13fd0 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a  ...if (isStr) {.
13fe0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
13ff0 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a  w(BIO_s_mem());.
14000 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
14010 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
14020 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
14030 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
14040 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
14050 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
14060 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
14070 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
14080 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
14090 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
140a0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
140b0 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65  erp,keyout,buffe
140c0 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
140d0 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
140e0 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
140f0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
14100 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
14110 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
14120 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
14130 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74  ename(out,keyout
14140 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
14150 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
14160 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
14170 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
14180 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f  );...    /* PEM_
14190 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69  write_bio_RSAPri
141a0 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61  vateKey(out, rsa
141b0 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c  , NULL, NULL, 0,
141c0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f   NULL, NULL); */
141d0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
141e0 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a  all(out);.. .}..
141f0 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39  ..if ((cert=X509
14200 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b  _new())==NULL) {
14210 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
14220 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
14230 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65  or generating ce
14240 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73  rtificate reques
14250 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  t",NULL);...    
14260 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14270 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
14280 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
14290 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
142a0 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
142b0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72  ;.#endif...    r
142c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
142d0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74  ...}....X509_set
142e0 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29  _version(cert,2)
142f0 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52  ;...ASN1_INTEGER
14300 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65  _set(X509_get_se
14310 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29  rialNumber(cert)
14320 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39  ,serial);...X509
14330 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
14340 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28  _getm_notBefore(
14350 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
14360 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
14370 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63  _getm_notAfter(c
14380 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30  ert),(long)60*60
14390 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30  *24*days);...X50
143a0 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72  9_set_pubkey(cer
143b0 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65  t,pkey);....name
143c0 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63  =X509_get_subjec
143d0 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09  t_name(cert);...
143e0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
143f0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14400 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"C", MBSTRING_A
14410 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14420 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
14430 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14440 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14450 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14460 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
14470 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14480 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c  ed char *) k_ST,
14490 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
144a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
144b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
144c0 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  L", MBSTRING_ASC
144d0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
144e0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d  d char *) k_L, -
144f0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14500 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14510 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22  _by_txt(name,"O"
14520 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
14530 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14540 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c  char *) k_O, -1,
14550 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14560 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14570 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c  y_txt(name,"OU",
14580 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14590 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
145a0 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c  har *) k_OU, -1,
145b0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
145c0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
145d0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c  y_txt(name,"CN",
145e0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
145f0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14600 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c  har *) k_CN, -1,
14610 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14620 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14630 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69  y_txt(name,"Emai
14640 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  l", MBSTRING_ASC
14650 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14660 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69  d char *) k_Emai
14670 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a  l, -1, -1, 0);..
14680 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65  ..X509_set_subje
14690 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d  ct_name(cert,nam
146a0 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39  e);....if (!X509
146b0 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c  _sign(cert,pkey,
146c0 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b  EVP_sha256())) {
146d0 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  ...    X509_free
146e0 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56  (cert);...    EV
146f0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
14700 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
14710 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
14720 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
14730 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
14740 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c  #endif...    Tcl
14750 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
14760 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67  p,"Error signing
14770 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55   certificate",NU
14780 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
14790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
147a0 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  ....if (isStr) {
147b0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
147c0 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
147d0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
147e0 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
147f0 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  rt);...    i=BIO
14800 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
14810 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
14820 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
14830 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
14840 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
14850 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
14860 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
14870 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
14880 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
14890 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
148a0 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
148b0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
148c0 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
148d0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
148e0 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70  e_filename(out,p
148f0 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  emout);...    PE
14900 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
14910 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
14920 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
14930 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ut);...}....X509
14940 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
14950 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
14960 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
14970 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
14980 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42   0x30000000L...B
14990 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
149a0 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62  dif..    }..}..b
149b0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
149c0 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t:..break;.    }
149d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
149e0 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  OK;.}.../*******
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
14a00 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20  * Init          
14a10 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
14a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
14a30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
14a80 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Free --. *. *.T
14a90 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
14aa0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
14ab0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
14ac0 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
14ad0 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
14ae0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
14af0 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a  ls below 1. *. *
14b00 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
14b10 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
14b20 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
14b30 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
14b40 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b80 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
14b90 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65 65  ls_Free(tls_free
14ba0 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29  _type *blockPtr)
14bb0 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
14bc0 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
14bd0 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20  *)blockPtr;..   
14be0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
14bf0 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65  ");..    Tls_Cle
14c00 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  an(statePtr);.  
14c10 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74    ckfree(blockPt
14c20 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
14c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c70 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e  . *. * Tls_Clean
14c80 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
14c90 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
14ca0 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f  up when a SSL so
14cb0 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
14cc0 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20  el. *.is closed 
14cd0 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63  and its referenc
14ce0 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65  e count falls be
14cf0 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f  low 1.  This sho
14d00 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64  uld. *.be called
14d10 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62   synchronously b
14d20 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c  y the CloseProc,
14d30 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45   not in the. *.E
14d40 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61  ventuallyFree ca
14d50 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
14d60 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
14d70 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
14d80 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
14d90 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14de0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f  --. */.void Tls_
14df0 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61  Clean(State *sta
14e00 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72  tePtr) {.    dpr
14e10 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
14e20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77  .    /*.     * w
14e30 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65  e're assuming he
14e40 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69  re that we're si
14e50 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20  ngle-threaded.  
14e60 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74     */.    if (st
14e70 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
14e80 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
14e90 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
14ea0 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
14eb0 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
14ec0 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
14ed0 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  imer = NULL;.   
14ee0 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
14ef0 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a  ePtr->protos) {.
14f00 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72  .ckfree(statePtr
14f10 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74  ->protos);..stat
14f20 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
14f30 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14f40 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  f (statePtr->bio
14f50 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c  ) {../* This wil
14f60 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64  l call SSL_shutd
14f70 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35  own. Bug 1414045
14f80 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49   */..dprintf("BI
14f90 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c  O_free_all(%p)",
14fa0 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b   statePtr->bio);
14fb0 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73  ..BIO_free_all(s
14fc0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
14fd0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20  statePtr->bio = 
14fe0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
14ff0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73  if (statePtr->ss
15000 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53  l) {..dprintf("S
15010 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74  SL_free(%p)", st
15020 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53  atePtr->ssl);..S
15030 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  SL_free(statePtr
15040 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74  ->ssl);..statePt
15050 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ssl = NULL;. 
15060 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
15070 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53  tePtr->ctx) {..S
15080 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  SL_CTX_free(stat
15090 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61  ePtr->ctx);..sta
150a0 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c  tePtr->ctx = NUL
150b0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
150c0 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
150d0 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ack) {..Tcl_Decr
150e0 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
150f0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73  r->callback);..s
15100 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
15110 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  k = NULL;.    }.
15120 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
15130 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54  ->password) {..T
15140 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
15150 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
15160 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  rd);..statePtr->
15170 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b  password = NULL;
15180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
15190 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b  tatePtr->vcmd) {
151a0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
151b0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  nt(statePtr->vcm
151c0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76  d);..statePtr->v
151d0 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  cmd = NULL;.    
151e0 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
151f0 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c  Returning");.}..
15200 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
15250 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43 6f   * Build Info Co
15260 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43  mmand --. *. *.C
15270 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
15280 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69 6e   return build in
15290 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e 0a  fo for package..
152a0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
152b0 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
152c0 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69   result. *. * Si
152d0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
152e0 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e 66  reated build-inf
152f0 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a  o command.. *. *
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15340 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e  ------. */..#ifn
15350 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 20  def STRINGIFY.# 
15360 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46   define STRINGIF
15370 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 28  Y(x) STRINGIFY1(
15380 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52  x).#  define STR
15390 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 65  INGIFY1(x) #x.#e
153a0 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64 49  ndif..int.BuildI
153b0 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49  nfoCommand(Tcl_I
153c0 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20 7b  nterp* interp) {
153d0 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  .    Tcl_CmdInfo
153e0 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20 28   info;..    if (
153f0 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
15400 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63  fo(interp, "::tc
15410 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20  l::build-info", 
15420 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43  &info)) {..Tcl_C
15430 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15440 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
15450 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e 66  build-info", inf
15460 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64  o.objProc, (void
15470 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f 56   *)(...PACKAGE_V
15480 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e  ERSION "+" STRIN
15490 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e  GIFY(TLS_VERSION
154a0 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66 69 6e  _UUID).#if defin
154b0 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26  ed(__clang__) &&
154c0 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67   defined(__clang
154d0 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20  _major__)....   
154e0 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e   ".clang-" STRIN
154f0 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a  GIFY(__clang_maj
15500 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e  or__).#if __clan
15510 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09  g_minor__ < 10..
15520 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66  ..    "0".#endif
15530 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46  ....    STRINGIF
15540 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f  Y(__clang_minor_
15550 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  _).#endif.#if de
15560 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75  fined(__cplusplu
15570 73 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  s) && !defined(_
15580 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20  _OBJC__)....    
15590 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e  ".cplusplus".#en
155a0 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  dif.#ifndef NDEB
155b0 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75  UG....    ".debu
155c0 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  g".#endif.#if !d
155d0 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
155e0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
155f0 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20  INTEL_COMPILER) 
15600 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55  && defined(__GNU
15610 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63  C__)....    ".gc
15620 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f  c-" STRINGIFY(__
15630 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e  GNUC__).#if __GN
15640 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a  UC_MINOR__ < 10.
15650 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69  ...    "0".#endi
15660 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49  f....    STRINGI
15670 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f  FY(__GNUC_MINOR_
15680 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  _).#endif.#ifdef
15690 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45   __INTEL_COMPILE
156a0 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22  R....    ".icc-"
156b0 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54   STRINGIFY(__INT
156c0 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e  EL_COMPILER).#en
156d0 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d  dif.#ifdef TCL_M
156e0 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20  EM_DEBUG....    
156f0 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64  ".memdebug".#end
15700 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
15710 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20  MSC_VER)....    
15720 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49  ".msvc-" STRINGI
15730 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e  FY(_MSC_VER).#en
15740 64 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e  dif.#ifdef USE_N
15750 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d  MAKE....    ".nm
15760 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  ake".#endif.#ifn
15770 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49  def TCL_CFG_OPTI
15780 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e  MIZED....    ".n
15790 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64  o-optimize".#end
157a0 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43  if.#ifdef __OBJC
157b0 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65  __....    ".obje
157c0 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66  ctive-c".#if def
157d0 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73  ined(__cplusplus
157e0 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c  )....    "pluspl
157f0 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  us".#endif.#endi
15800 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47  f.#ifdef TCL_CFG
15810 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20  _PROFILED....   
15820 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64   ".profile".#end
15830 69 66 0a 23 69 66 64 65 66 20 50 55 52 49 46 59  if.#ifdef PURIFY
15840 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69 66 79  ....    ".purify
15850 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
15860 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09  STATIC_BUILD....
15870 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65      ".static".#e
15880 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b  ndif...), NULL);
15890 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
158a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
158b0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158f0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
15900 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Init --. *. *.T
15910 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65  his is a package
15920 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
15930 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68  procedure, which
15940 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79   is called. *.by
15950 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70   Tcl when this p
15960 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20  ackage is to be 
15970 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  added to an inte
15980 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52  rpreter.. *. * R
15990 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e  esults:  Ssl con
159a0 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64  figured and load
159b0 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ed. *. * Side ef
159c0 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74  fects:. *. creat
159d0 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e  e the ssl comman
159e0 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73  d, initialize ss
159f0 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d  l context. *. *-
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a40 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 4c 5f  --. */..#if TCL_
15a50 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20  MAJOR_VERSION > 
15a60 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45  8.#define MIN_VE
15a70 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73  RSION "9.0".#els
15a80 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45  e.#define MIN_VE
15a90 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64  RSION "8.5".#end
15aa0 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  if..static const
15ab0 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74   char tlsTclInit
15ac0 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e  Script[] = {.#in
15ad0 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68  clude "tls.tcl.h
15ae0 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a  "..0x00.    };..
15af0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
15b00 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
15b10 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20  p *interp) {..  
15b20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
15b30 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45  d");..#ifdef USE
15b40 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69  _TCL_STUBS.    i
15b50 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f (Tcl_InitStubs
15b60 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52  (interp, MIN_VER
15b70 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c  SION, 0) == NULL
15b80 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
15b90 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
15ba0 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  dif.    if (Tcl_
15bb0 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72  PkgRequire(inter
15bc0 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45  p, "Tcl", MIN_VE
15bd0 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c  RSION, 0) == NUL
15be0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
15bf0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
15c00 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69     if (TlsLibIni
15c10 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  t(0) != TCL_OK) 
15c20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
15c30 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
15c40 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  ld not initializ
15c50 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20  e SSL library", 
15c60 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
15c70 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
15c80 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
15c90 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15ca0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
15cb0 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70  s::ciphers", Cip
15cc0 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  hersObjCmd, (Cli
15cd0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15ce0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15cf0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15d00 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15d10 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
15d20 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22  tls::connection"
15d30 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  , ConnectionInfo
15d40 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15d50 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
15d60 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15d70 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15d80 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15d90 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
15da0 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e  :handshake", Han
15db0 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43  dshakeObjCmd, (C
15dc0 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15dd0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15de0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15df0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15e00 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15e10 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20  ::tls::import", 
15e20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  ImportObjCmd, (C
15e30 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15e40 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15e50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15e60 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15e70 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15e80 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22  ::tls::unimport"
15e90 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  , UnimportObjCmd
15ea0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
15eb0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15ec0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15ed0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15ee0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15ef0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75  p, "::tls::statu
15f00 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  s", StatusObjCmd
15f10 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
15f20 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15f30 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15f40 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15f50 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15f60 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69  p, "::tls::versi
15f70 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43  on", VersionObjC
15f80 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
15f90 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
15fa0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15fb0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15fc0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15fd0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73  erp, "::tls::mis
15fe0 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20  c", MiscObjCmd, 
15ff0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
16000 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
16010 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
16020 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
16030 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
16040 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f   "::tls::protoco
16050 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  ls", ProtocolsOb
16060 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
16070 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
16080 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
16090 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64  ULL);..    Build
160a0 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  InfoCommand(inte
160b0 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e  rp);..    if (in
160c0 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c  terp && Tcl_Eval
160d0 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49  (interp, tlsTclI
160e0 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43  nitScript) != TC
160f0 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
16100 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
16110 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  ..    return Tcl
16120 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
16130 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45  rp, PACKAGE_NAME
16140 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
16150 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  N);.}../*. *----
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16190 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61  --*. *. *.Tls_Sa
161a0 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  feInit --. *. *.
161b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72  *. *.Standard pr
161f0 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64  ocedure required
16200 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49   by 'load'.. *.I
16210 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20  nitializes this 
16220 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20  extension for a 
16230 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72  safe interpreter
16240 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *.-----------
16250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16270 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
16280 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41  e effects:. *..A
16290 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a  s of 'Tls_Init'.
162a0 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a   *. *.Result:. *
162b0 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  ..A standard Tcl
162c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a   error code.. *.
162d0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
162e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c  --------*. */.DL
16310 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
16320 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
16330 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
16340 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
16350 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
16360 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70   Tls_Init(interp
16370 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163b0 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49  -*. *. *.TlsLibI
163c0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20  -------------*. 
16400 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53  *.Initializes SS
16410 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70  L library once p
16420 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20  er application. 
16430 2a 09 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 2d  ----------------
16460 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
16470 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74  ffects:. *..init
16480 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
16490 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  ary. *. *.Result
164a0 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  :. *..none. *. *
164b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164e0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74  ------*. */.stat
164f0 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69  ic int TlsLibIni
16500 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69  t(int uninitiali
16510 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63  ze) {.    static
16520 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   int initialized
16530 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74   = 0;.    int st
16540 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23  atus = TCL_OK;.#
16550 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
16560 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
16570 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
16580 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e  DS).    size_t n
16590 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66  um_locks;.#endif
165a0 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74  ..    if (uninit
165b0 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21  ialize) {..if (!
165c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
165d0 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b      dprintf("Ask
165e0 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
165f0 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e  ze, but we are n
16600 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29  ot initialized")
16610 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
16620 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69  CL_OK;..}...dpri
16630 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
16640 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23  initialize");..#
16650 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
16660 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
16670 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
16680 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f  DS)..Tcl_MutexLo
16690 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09  ck(&init_mx);...
166a0 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20  if (locks) {..  
166b0 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09    free(locks);..
166c0 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c      locks = NULL
166d0 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  ;..    locksCoun
166e0 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66  t = 0;..}.#endif
166f0 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  ..initialized = 
16700 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
16710 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
16720 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
16730 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
16740 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
16750 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65  mx);.#endif...re
16760 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
16770 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74   }..    if (init
16780 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69  ialized) {..dpri
16790 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74  ntf("Called, but
167a0 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61   using cached va
167b0 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73  lue");..return s
167c0 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  tatus;.    }..  
167d0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
167e0 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  d");..#if define
167f0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
16800 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
16810 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54  L_THREADS).    T
16820 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e  cl_MutexLock(&in
16830 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20  it_mx);.#endif. 
16840 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d     initialized =
16850 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   1;..#if defined
16860 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
16870 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
16880 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75  _THREADS).    nu
16890 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20  m_locks = 1;.   
168a0 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69   locksCount = (i
168b0 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20  nt) num_locks;. 
168c0 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f     locks = mallo
168d0 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29  c(sizeof(*locks)
168e0 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20   * num_locks);. 
168f0 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c     memset(locks,
16900 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b   0, sizeof(*lock
16910 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
16920 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16930 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20  Initialize BOTH 
16940 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69  libcrypto and li
16950 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45  bssl. */.    OPE
16960 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50  NSSL_init_ssl(OP
16970 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
16980 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50  SSL_STRINGS | OP
16990 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
169a0 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09  CRYPTO_STRINGS..
169b0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
169c0 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c  DD_ALL_CIPHERS |
169d0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44   OPENSSL_INIT_AD
169e0 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e  D_ALL_DIGESTS, N
169f0 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e  ULL);..    BIO_n
16a00 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b  ew_tcl(NULL, 0);
16a10 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20  ..#if 0.    /*. 
16a20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20      * XXX:TODO: 
16a30 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65  Remove this code
16a40 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
16a50 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20  with a check.   
16a60 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65    * for enough e
16a70 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f  ntropy and do no
16a80 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  t try to create 
16a90 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74  our own.     * t
16aa0 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a  errible entropy.
16ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20       */.    /*. 
16ac0 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72      * Seed the r
16ad0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
16ae0 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53  erator in the SS
16af0 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20  L library,.     
16b00 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77  * using the do/w
16b10 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62  hile construct b
16b20 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75  ecause of the bu
16b30 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20  g note in the.  
16b40 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51     * OpenSSL FAQ
16b50 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f   at http://www.o
16b60 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f  penssl.org/suppo
16b70 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52  rt/faq.html#USER
16b80 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  1.     *.     * 
16b90 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20  The crux of the 
16ba0 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20  problem is that 
16bb0 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e  Solaris 7 does n
16bc0 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a  ot have a.     *
16bd0 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20   /dev/random or 
16be0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76  /dev/urandom dev
16bf0 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74  ice so it cannot
16c00 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20   gather enough. 
16c10 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72      * entropy fr
16c20 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64  om the RAND_seed
16c30 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74  () when TLS init
16c40 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75  ializes and refu
16c50 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f  ses.     * to go
16c60 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65   further. Earlie
16c70 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70  r versions of Op
16c80 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e  enSSL carried on
16c90 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
16ca0 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28    */.    srand((
16cb0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69  unsigned int) ti
16cc0 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55  me((time_t *) NU
16cd0 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09  LL));.    do {..
16ce0 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
16cf0 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  16; i++) {..    
16d00 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20  rnd_seed[i] = 1 
16d10 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20  + (char) (255.0 
16d20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d  * rand()/(RAND_M
16d30 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41  AX+1.0));..}..RA
16d40 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64  ND_seed(rnd_seed
16d50 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65  , sizeof(rnd_see
16d60 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65  d));.    } while
16d70 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20   (RAND_status() 
16d80 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  != 1);.#endif..#
16d90 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
16da0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
16db0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
16dc0 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e  DS)..Tcl_MutexUn
16dd0 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
16de0 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
16df0 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a           rn status;.}.