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: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
a840: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
a850: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
a860: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  *.. * Make sure 
a870: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
a880: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
a890: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  l.. */..chan = T
a8a0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
a8b0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c  (chan);..if (Tcl
a8c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
a8d0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
a8e0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20  nnelType()) {.. 
a8f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a900: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
a910: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
a920: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
a930: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
a940: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
a950: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a960: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
a970: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
a980: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
a990: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
a9a0: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
a9b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
a9c0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a9d0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a9e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a9f0: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61  ..}..ctx = ((Sta
aa00: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
aa10: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
aa20: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20  chan))->ctx;.   
aa30: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28   } else {..if ((
aa40: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73  ctx = CTX_Init(s
aa50: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c  tatePtr, server,
aa60: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c   proto, keyfile,
aa70: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20   certfile, key, 
aa80: 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f  cert, (int) key_
aa90: 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20  len,..    (int) 
aaa0: 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68  cert_len, CApath
aab0: 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72  , CAfile, cipher
aac0: 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c  s, ciphersuites,
aad0: 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73   level, DHparams
aae0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  )) == NULL) {.. 
aaf0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
ab00: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
ab10: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ab20: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
ab30: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
ab40: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f  tx = ctx;..    /
ab50: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64  *.     * We need
ab60: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ab70: 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77  at the channel w
ab80: 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28  orks in binary (
ab90: 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65  for the.     * e
aba0: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f  ncryption not to
abb0: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e   get goofed up).
abc0: 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20  .     * We only 
abd0: 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74  want to adjust t
abe0: 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20  he buffering in 
abf0: 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c  pre-v2 channels,
ac00: 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61   where.     * ea
ac10: 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68  ch channel in th
ac20: 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e  e stack maintain
ac30: 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65  ed its own buffe
ac40: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  rs..     */.    
ac50: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
ac60: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
ac70: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
ac80: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
ac90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
aca0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44  king);.    Tcl_D
acb0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
acc0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
acd0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
ace0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
acf0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
ad00: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
ad10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
ad20: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  han, "-eofchar",
ad30: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f   &upperChannelEO
ad40: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
ad50: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
ad60: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
ad70: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70  -encoding", &upp
ad80: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
ad90: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
ada0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
adb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
adc0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65  nslation", &uppe
add0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
ade0: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ion);.    Tcl_Ge
adf0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
ae00: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
ae10: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72  locking", &upper
ae20: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
ae30: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
ae40: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ae50: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
ae60: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79  lation", "binary
ae70: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ");.    Tcl_SetC
ae80: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
ae90: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f  erp, chan, "-blo
aea0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b  cking", "true");
aeb0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f  .    dprintf("Co
aec0: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e  nsuming Tcl chan
aed0: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  nel %s", Tcl_Get
aee0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
aef0: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  ));.    statePtr
af00: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61  ->self = Tcl_Sta
af10: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
af20: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  , Tls_ChannelTyp
af30: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  e(), (ClientData
af40: 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43  ) statePtr,..(TC
af50: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c  L_READABLE | TCL
af60: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e  _WRITABLE), chan
af70: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
af80: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20  Created channel 
af90: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47  named %s", Tcl_G
afa0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
afb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
afc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
afd0: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
afe0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
aff0: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f  ./*.. * No use o
b000: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79  f Tcl_Eventually
b010: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20  Free because no 
b020: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65  possible Tcl_Pre
b030: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73  serve... */..Tls
b040: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
b050: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
b060: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b070: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   }..    Tcl_SetC
b080: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b090: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b0a0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  elf, "-translati
b0b0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
b0c0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
b0d0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
b0e0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
b0f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
b100: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
b110: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  f, "-encoding", 
b120: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b130: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
b140: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
b150: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
b160: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
b170: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66  Ptr->self, "-eof
b180: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
b190: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b1a0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
b1b0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b1c0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b1d0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b1e0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
b1f0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
b200: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
b210: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  king));.    Tcl_
b220: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b230: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
b240: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
b250: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b260: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
b270: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b280: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b290: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
b2a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
b2b0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
b2c0: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f  locking);..    /
b2d0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69  *.     * SSL Ini
b2e0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
b2f0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
b300: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28  ->ssl = SSL_new(
b310: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
b320: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74      if (!statePt
b330: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53  r->ssl) {../* SS
b340: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20  L library error 
b350: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  */..Tcl_AppendRe
b360: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
b370: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74  uldn't construct
b380: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c   ssl session: ",
b390: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
b3a0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
b3b0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b3c0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b3d0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b3e0: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45  , "INIT", "FAILE
b3f0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
b400: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63  L);..Tls_Free((c
b410: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
b420: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
b430: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
b440: 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76  /* Set host serv
b450: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69  er name */.    i
b460: 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b  f (servername) {
b470: 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65  ../* Sets the se
b480: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
b490: 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c  tion (SNI) in Cl
b4a0: 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73  ientHello extens
b4b0: 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52  ion */../* Per R
b4c0: 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d  FC 6066, hostnam
b4d0: 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63  e is a ASCII enc
b4e0: 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f  oded string, tho
b4f0: 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79  ugh RFC 4366 say
b500: 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20  s UTF-8. */..if 
b510: 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74  (!SSL_set_tlsext
b520: 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65  _host_name(state
b530: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72  Ptr->ssl, server
b540: 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65  name) && require
b550: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
b560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b570: 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e  , "Set SNI exten
b580: 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20  sion failed: ", 
b590: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b5a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b5b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b5c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b5d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b5e0: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22   "SNI", "FAILED"
b5f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b600: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
b610: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
b620: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
b630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
b640: 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20  /* Set hostname 
b650: 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69  for peer certifi
b660: 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65  cate hostname ve
b670: 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c  rification in cl
b680: 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74  ients...   Don't
b690: 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f   use SSL_set1_ho
b6a0: 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20  st since it has 
b6b0: 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a  limitations. */.
b6c0: 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68  .if (!SSL_add1_h
b6d0: 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ost(statePtr->ss
b6e0: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20  l, servername)) 
b6f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b700: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b710: 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d  "Set DNS hostnam
b720: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  e failed: ", GET
b730: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b740: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b750: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b760: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b770: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48  S", "IMPORT", "H
b780: 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45  OSTNAME", "FAILE
b790: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
b7a0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
b7b0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
b7c0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
b7d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b7e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
b7f0: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20  sume session id 
b800: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69  */.    if (sessi
b810: 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28  on_id && strlen(
b820: 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53  session_id) <= S
b830: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c  SL_MAX_SID_CTX_L
b840: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c  ENGTH) {../* SSL
b850: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a  _set_session() *
b860: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53  /..if (!SSL_SESS
b870: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74  ION_set1_id_cont
b880: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73  ext(SSL_get_sess
b890: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ion(statePtr->ss
b8a0: 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73  l),...(const uns
b8b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65  igned char *) se
b8c0: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67  ssion_id, (unsig
b8d0: 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28  ned int) strlen(
b8e0: 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a  session_id))) {.
b8f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b900: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52  esult(interp, "R
b910: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61  esume session fa
b920: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
b930: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b940: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b950: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b960: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b970: 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49  "IMPORT", "SESSI
b980: 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ON", "FAILED", (
b990: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b9a0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b9b0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b9c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b9d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b9e0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20  ..    /* Enable 
b9f0: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65  Application-Laye
ba00: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  r Protocol Negot
ba10: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73  iation. Examples
ba20: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a   are: http/1.0,.
ba30: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  .http/1.1, h2, h
ba40: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f  3, ftp, imap, po
ba50: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c  p3, xmpp-client,
ba60: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71   xmpp-server, mq
ba70: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f  tt, irc, etc. */
ba80: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b  .    if (alpn) {
ba90: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
baa0: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  CL list into a p
bab0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
bac0: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
bad0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
bae0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
baf0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
bb00: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69  len = 0;..Tcl_Si
bb10: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20  ze cnt, i;..int 
bb20: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  j;..Tcl_Obj **li
bb30: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
bb40: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
bb50: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26  (interp, alpn, &
bb60: 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54  cnt, &list) != T
bb70: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c  CL_OK) {..    Tl
bb80: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
bb90: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
bba0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bbb0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
bbc0: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72  ine the memory r
bbd0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
bbe0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
bbf0: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
bc00: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20  < cnt; i++) {.. 
bc10: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
bc20: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c  FromObj(list[i],
bc30: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20   &len);..    if 
bc40: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09  (len > 255) {...
bc50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bc60: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70  (interp, "ALPN p
bc70: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f  rotocol names to
bc80: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a  o long", (char *
bc90: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53  ) NULL);...Tcl_S
bca0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
bcb0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
bcc0: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
bcd0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
bce0: 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65  NULL);...Tls_Fre
bcf0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
bd00: 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  Ptr);...return T
bd10: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
bd20: 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e  ..    protos_len
bd30: 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65   += 1 + (int) le
bd40: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64  n;..}.../* Build
bd50: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72   the complete pr
bd60: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
bd70: 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63  protos = ckalloc
bd80: 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f  (protos_len);../
bd90: 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73  * protocol-lists
bda0: 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69   consist of 8-bi
bdb0: 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65  t length-prefixe
bdc0: 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20  d, byte strings 
bdd0: 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20  */..for (j = 0, 
bde0: 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20  p = protos; j < 
bdf0: 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20  cnt; j++) {..   
be00: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c   char *str = Tcl
be10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
be20: 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29  j(list[j], &len)
be30: 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75  ;..    *p++ = (u
be40: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65  nsigned char) le
be50: 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70  n;..    memcpy(p
be60: 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20  , str, (size_t) 
be70: 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20  len);..    p += 
be80: 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c  len;..}.../* SSL
be90: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
bea0: 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66   makes a copy of
beb0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69   the protocol-li
bec0: 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20  st */../* Note: 
bed0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
bee0: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72  verses the retur
bef0: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69  n value conventi
bf00: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73  on */..if (SSL_s
bf10: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73  et_alpn_protos(s
bf20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72  tatePtr->ssl, pr
bf30: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e  otos, protos_len
bf40: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
bf50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
bf60: 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f  p, "Set ALPN pro
bf70: 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22  tocols failed: "
bf80: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
bf90: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
bfa0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
bfb0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
bfc0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
bfd0: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
bfe0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
bff0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
c000: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
c010: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72  ePtr);..    ckfr
c020: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20  ee(protos);..   
c030: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c040: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65  R;..}.../* Store
c050: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
c060: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  */..statePtr->pr
c070: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09  otos = protos;..
c080: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c090: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65  _len = protos_le
c0a0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
c0b0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
c0c0: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65  s = NULL;..state
c0d0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c0e0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
c0f0: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
c100: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
c110: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f      SSL_set_app_
c120: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73  data(statePtr->s
c130: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
c140: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20  ePtr);./* point 
c150: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20  back to us */.  
c160: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79    SSL_set_verify
c170: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c180: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61  verify, VerifyCa
c190: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
c1a0: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61  _set_info_callba
c1b0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
c1c0: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b  , InfoCallback);
c1d0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  ..    /* Callbac
c1e0: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20  k for observing 
c1f0: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65  protocol message
c200: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  s */.#ifndef OPE
c210: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
c220: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53  E.    /* void SS
c230: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
c240: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
c250: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
c260: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
c270: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
c280: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73  t_msg_callback(s
c290: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65  tatePtr->ctx, Me
c2a0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20  ssageCallback); 
c2b0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d  */.    SSL_set_m
c2c0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28  sg_callback_arg(
c2d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c2e0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c2f0: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73  ;.    SSL_set_ms
c300: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  g_callback(state
c310: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67  Ptr->ssl, Messag
c320: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64  eCallback);.#end
c330: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  if..    /* Creat
c340: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49  e Tcl_Channel BI
c350: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20  O Handler */.   
c360: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
c370: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73  .= BIO_new_tcl(s
c380: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43  tatePtr, BIO_NOC
c390: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65  LOSE);.    state
c3a0: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e  Ptr->bio.= BIO_n
c3b0: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b  ew(BIO_f_ssl());
c3c0: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  ..    if (server
c3d0: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63  ) {../* Server c
c3e0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c  allbacks */..SSL
c3f0: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
c400: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73  servername_arg(s
c410: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76  tatePtr->ctx, (v
c420: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c430: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
c440: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
c450: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c460: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62  r->ctx, SNICallb
c470: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ack);..SSL_CTX_s
c480: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  et_client_hello_
c490: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c4a0: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c  , HelloCallback,
c4b0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c4c0: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74  r);..if (statePt
c4d0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
c4e0: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  L) {..    SSL_CT
c4f0: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63  X_set_alpn_selec
c500: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  t_cb(statePtr->c
c510: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  tx, ALPNCallback
c520: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c530: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f  tr);.#ifdef USE_
c540: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73  NPN..    if (tls
c550: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
c560: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c  _3 == 0) {...SSL
c570: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
c580: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f  otos_advertised_
c590: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c5a0: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28  , NPNCallback, (
c5b0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c5c0: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  ;..    }.#endif.
c5d0: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73  .}.../* Enable s
c5e0: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65  erver to send ce
c5f0: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72  rt request after
c600: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20   handshake (TLS 
c610: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a  1.3 only) */../*
c620: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69   A write operati
c630: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61  on must take pla
c640: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69  ce for the Certi
c650: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74  ficate Request t
c660: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f  o be..   sent to
c670: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69   the client, thi
c680: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69  s can be done wi
c690: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68  th SSL_do_handsh
c6a0: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72  ake(). */..if (r
c6b0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
c6c0: 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31  andshake && tls1
c6d0: 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76  _3) {..    SSL_v
c6e0: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73  erify_client_pos
c6f0: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74  t_handshake(stat
c700: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a  ePtr->ssl);..}..
c710: 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69  ./* set automati
c720: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f  c curve selectio
c730: 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63  n */..SSL_set_ec
c740: 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72  dh_auto(statePtr
c750: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20  ->ssl, 1);.../* 
c760: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20  Set server mode 
c770: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c  */..statePtr->fl
c780: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53  ags |= TLS_TCL_S
c790: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f  ERVER;..SSL_set_
c7a0: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61  accept_state(sta
c7b0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
c7c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c   } else {../* Cl
c7d0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a  ient callbacks *
c7e0: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
c7f0: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
c800: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26  protos != NULL &
c810: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26  & tls1_2 == 0 &&
c820: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
c830: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c840: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65  _next_proto_sele
c850: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
c860: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
c870: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c880: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  Ptr);..}.#endif.
c890: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63  ../* Session cac
c8a0: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  hing */..SSL_CTX
c8b0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _set_session_cac
c8c0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
c8d0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f  ->ctx, SSL_SESS_
c8e0: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53  CACHE_CLIENT | S
c8f0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f  SL_SESS_CACHE_NO
c900: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29  _INTERNAL_STORE)
c910: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f  ;..SSL_CTX_sess_
c920: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65  set_new_cb(state
c930: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f  Ptr->ctx, Sessio
c940: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a  nCallback);.../*
c950: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e   Enable post han
c960: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63  dshake Authentic
c970: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e  ation extension.
c980: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e   TLS 1.3 only, n
c990: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69  ot http/2. */..i
c9a0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
c9b0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
c9c0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73  .    SSL_set_pos
c9d0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68  t_handshake_auth
c9e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c9f0: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  1);..}.../* Set 
ca00: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09  client mode */..
ca10: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f  SSL_set_connect_
ca20: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
ca30: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
ca40: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74  SSL_set_bio(stat
ca50: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65  ePtr->ssl, state
ca60: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74  Ptr->p_bio, stat
ca70: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20  ePtr->p_bio);.  
ca80: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74    BIO_set_ssl(st
ca90: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61  atePtr->bio, sta
caa0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f  tePtr->ssl, BIO_
cab0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f  NOCLOSE);..    /
cac0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20  *.     * End of 
cad0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f  SSL Init.     */
cae0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
caf0: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c  turning %s", Tcl
cb00: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
cb10: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29  statePtr->self))
cb20: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
cb30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
cb40: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  r *) Tcl_GetChan
cb50: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
cb60: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c  ->self), TCL_VOL
cb70: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74  ATILE);..    ret
cb80: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
cb90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55  --------. *. * U
cbe0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d  nimportObjCmd --
cbf0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
cc00: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
cc10: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
cc20: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66  opmost channel f
cc30: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  ilter.. *. * Res
cc40: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
cc50: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
cc60: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
cc70: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
cc80: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
cc90: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
cca0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
ccf0: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72  atic int.Unimpor
cd00: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
cd10: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
cd20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cd30: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
cd40: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
cd50: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
cd60: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
cd70: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
cd80: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
cd90: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
cda0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
cdb0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
cdc0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
cdd0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
cde0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cdf0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
ce00: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
ce10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ce20: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
ce30: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
ce40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
ce50: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
ce60: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
ce70: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
ce80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
ce90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
cea0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
ceb0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
cec0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
ced0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
cee0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
cef0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69  el(chan);..    i
cf00: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
cf10: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
cf20: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
cf30: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
cf40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
cf50: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
cf60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
cf70: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
cf80: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
cf90: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  el", (char *) NU
cfa0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
cfb0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
cfc0: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50  p, "TLS", "UNIMP
cfd0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
cfe0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
cff0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
d000: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d010: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
d020: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c  l_UnstackChannel
d030: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d  (interp, chan) =
d040: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
d050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d060: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
d070: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
d080: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
d0d0: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
d0e0: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
d0f0: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
d100: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
d110: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
d120: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
d130: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d140: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
d150: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
d160: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
d170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
d1b0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
d1c0: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
d1d0: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
d1e0: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
d1f0: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
d200: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
d210: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
d220: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
d230: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74   char *cert, int
d240: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65   key_len, int ce
d250: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41  rt_len, char *CA
d260: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a  path,.    char *
d270: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69  CAfile, char *ci
d280: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70  phers, char *cip
d290: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c  hersuites, int l
d2a0: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61  evel, char *DHpa
d2b0: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f  rams) {.    Tcl_
d2c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
d2d0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
d2e0: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  p;.    SSL_CTX *
d2f0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
d300: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
d310: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c      int off = 0,
d320: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   abort = 0;.    
d330: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65  int load_private
d340: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  _key;.    const 
d350: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68  SSL_METHOD *meth
d360: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  od;..    dprintf
d370: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
d380: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09   if (!proto) {..
d390: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d3a0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c  (interp, "no val
d3b0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  id protocol sele
d3c0: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  cted", (char *) 
d3d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d3e0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
d3f0: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f  /* create SSL co
d400: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45  ntext */.#if OPE
d410: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
d420: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30  BER >= 0x1010000
d430: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f  0L || defined(NO
d440: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL2) || define
d450: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
d460: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
d470: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d480: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63  OTO_SSL2)) {..Tc
d490: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4a0: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f  nterp, "SSL2 pro
d4b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d4c0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
d4d0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d4e0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
d4f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
d500: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
d510: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
d520: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d530: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d540: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c  TO_SSL3)) {..Tcl
d550: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d560: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74  terp, "SSL3 prot
d570: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d580: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d590: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d5a0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d5b0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d5c0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
d5d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d5e0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d5f0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d600: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f  O_TLS1)) {..Tcl_
d610: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d620: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72  erp, "TLS 1.0 pr
d630: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d640: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d650: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d660: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d670: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d680: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
d690: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d6a0: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45  LS1_1).    if (E
d6b0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d6c0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29  S_PROTO_TLS1_1))
d6d0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d6e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d6f0: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.1 protocol n
d700: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d710: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d720: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d730: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d740: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
d750: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d760: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
d770: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d780: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d790: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_2)) {..Tcl_
d7a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d7b0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72  erp, "TLS 1.2 pr
d7c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d7d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d7e0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d7f0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d800: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d810: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
d820: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d830: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45  LS1_3).    if (E
d840: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d850: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29  S_PROTO_TLS1_3))
d860: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d870: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d880: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.3 protocol n
d890: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d8a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d8b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d8c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
d8d0: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a   (proto == 0) {.
d8e0: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e  ./* Use full ran
d8f0: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ge */..SSL_CTX_s
d900: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72  et_min_proto_ver
d910: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53  sion(ctx, 0);..S
d920: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
d930: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
d940: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
d950: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20   switch (proto) 
d960: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
d970: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d980: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
d990: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
d9a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d9b0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
d9c0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d9d0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  SSL2:..method = 
d9e0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32  isServer ? SSLv2
d9f0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
da00: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f   : SSLv2_client_
da10: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
da20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
da30: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
da40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
da50: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
da60: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
da70: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
da80: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
da90: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64  TO_SSL3:..method
daa0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
dab0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv3_server_metho
dac0: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65  d() : SSLv3_clie
dad0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
dae0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
daf0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
db00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
db10: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
db20: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
db30: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
db40: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
db50: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74  PROTO_TLS1:..met
db60: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
db70: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65   TLSv1_server_me
db80: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63  thod() : TLSv1_c
db90: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
dba0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
dbb0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dbc0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
dbd0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
dbe0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
dbf0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dc00: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
dc10: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
dc20: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  LS1_1:..method =
dc30: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
dc40: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  1_1_server_metho
dc50: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c  d() : TLSv1_1_cl
dc60: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
dc70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
dc80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
dc90: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
dca0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dcb0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
dcc0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dcd0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _2_METHOD).    c
dce0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
dcf0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_2:..method = 
dd00: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
dd10: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _2_server_method
dd20: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69  () : TLSv1_2_cli
dd30: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
dd40: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
dd50: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
dd60: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
dd70: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dd80: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  _3).    case TLS
dd90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09  _PROTO_TLS1_3:..
dda0: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72  /* Use the gener
ddb0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f  ic method and co
ddc0: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61  nstraint range a
ddd0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20  fter context is 
dde0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68  created */..meth
ddf0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
de00: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  TLS_server_metho
de10: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74  d() : TLS_client
de20: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
de30: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
de40: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74  fault:../* Negot
de50: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61  iate highest ava
de60: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76  ilable SSL/TLS v
de70: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f  ersion */..metho
de80: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
de90: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
dea0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
deb0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50  method();.#if OP
dec0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
ded0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
dee0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
def0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
df00: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
df10: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL2)..off |= (EN
df20: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
df30: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f  _PROTO_SSL2)   ?
df40: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
df50: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv2);.#endif.#i
df60: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
df70: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
df80: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
df90: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dfa0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dfb0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a  TO_SSL3)   ? 0 :
dfc0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33   SSL_OP_NO_SSLv3
dfd0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
dfe0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
dff0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e000: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66  SSL_NO_TLS1)..of
e010: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
e020: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
e030: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  LS1)   ? 0 : SSL
e040: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23  _OP_NO_TLSv1);.#
e050: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
e060: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
e070: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e080: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66  L_NO_TLS1_1)..of
e090: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
e0a0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
e0b0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_1) ? 0 : SSL
e0c0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b  _OP_NO_TLSv1_1);
e0d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e0e0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
e0f0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e100: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09  SSL_NO_TLS1_2)..
e110: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
e120: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
e130: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53  _TLS1_2) ? 0 : S
e140: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32  SL_OP_NO_TLSv1_2
e150: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
e160: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
e170: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e180: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
e190: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
e1a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
e1b0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a  TO_TLS1_3) ? 0 :
e1c0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
e1d0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65  _3);.#endif..bre
e1e0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  ak;.    }..    E
e1f0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
e200: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c  ;..    ctx = SSL
e210: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29  _CTX_new(method)
e220: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20  ;.    if (!ctx) 
e230: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
e240: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67      }..    if (g
e250: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
e260: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58  ILE)) {..SSL_CTX
e270: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c  _set_keylog_call
e280: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67  back(ctx, KeyLog
e290: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
e2a0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
e2b0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
e2c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e2d0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
e2e0: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52  (proto == TLS_PR
e2f0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53  OTO_TLS1_3) {..S
e300: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
e310: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
e320: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
e330: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
e340: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
e350: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
e360: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65  RSION);.    }.#e
e370: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  ndif..    /* For
e380: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74  ce cipher select
e390: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72  ion order by ser
e3a0: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  ver */.    if (!
e3b0: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c  isServer) {..SSL
e3c0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e3d0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50  (ctx, SSL_OP_CIP
e3e0: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45  HER_SERVER_PREFE
e3f0: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23  RENCE);.    }..#
e400: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
e410: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
e420: 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e  100000L.    Open
e430: 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f  SSL_add_all_algo
e440: 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61  rithms(); /* Loa
e450: 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69  d ciphers and di
e460: 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  gests */.#endif.
e470: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e480: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28  _app_data(ctx, (
e490: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f  void*)interp);./
e4a0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69  * remember the i
e4b0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
e4c0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
e4d0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
e4e0: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53  P_ALL);./* all S
e4f0: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
e500: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
e510: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
e520: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d  x, SSL_OP_NO_COM
e530: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69  PRESSION);./* di
e540: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f  sable compressio
e550: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72  n even if suppor
e560: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ted */.    SSL_C
e570: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
e580: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69  tx, off);../* di
e590: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76  sable protocol v
e5a0: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f  ersions */.#if O
e5b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
e5c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30  UMBER < 0x101010
e5d0: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  00L.    SSL_CTX_
e5e0: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53  set_mode(ctx, SS
e5f0: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52  L_MODE_AUTO_RETR
e600: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65  Y);./* handle ne
e610: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20  w handshakes in 
e620: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62  background. On b
e630: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65  y default in Ope
e640: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23  nSSL 1.1.1. */.#
e650: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54  endif.    SSL_CT
e660: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65  X_sess_set_cache
e670: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b  _size(ctx, 128);
e680: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
e690: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72  r defined cipher
e6a0: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73  s, cipher suites
e6b0: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c  , and security l
e6c0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
e6d0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c  (ciphers != NULL
e6e0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e6f0: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74  t_cipher_list(ct
e700: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09  x, ciphers)) {..
e710: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e720: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
e730: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f  phers failed: No
e740: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
e750: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e760: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e770: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e780: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
e790: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21  ((ciphersuites !
e7a0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
e7b0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75  CTX_set_ciphersu
e7c0: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72  ites(ctx, cipher
e7d0: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f  suites)) {..Tcl_
e7e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e7f0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
e800: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20   suites failed: 
e810: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
e820: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e830: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e840: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e850: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
e860: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20  /* Set security 
e870: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
e880: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c  (level > -1 && l
e890: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20  evel < 6) {../* 
e8a0: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79  SSL_set_security
e8b0: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43  _level */..SSL_C
e8c0: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  TX_set_security_
e8d0: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c  level(ctx, level
e8e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e8f0: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
e900: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
e910: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
e920: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
e930: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
e940: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e950: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e960: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c  cb_userdata(ctx,
e970: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
e980: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64  r);..    /* read
e990: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61   a Diffie-Hellma
e9a0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  n parameters fil
e9b0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75  e, or use the bu
e9c0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20  ilt-in one */.  
e9d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
e9e0: 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66 20 4f  t(&ds);.#ifdef O
e9f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20  PENSSL_NO_DH.   
ea00: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d   if (DHparams !=
ea10: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
ea20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ea30: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72  p, "DH parameter
ea40: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61   support not ava
ea50: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a  ilable", (char *
ea60: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
ea70: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
ea80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
ea90: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48  .#else.    {..DH
eaa0: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72  * dh;..if (DHpar
eab0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
eac0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09      BIO *bio;...
ead0: 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65      bio = BIO_ne
eae0: 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72  w_file(F2N(DHpar
eaf0: 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b  ams, &ds), "r");
eb00: 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20  ..    if (!bio) 
eb10: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
eb20: 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f  ree(&ds);...Tcl_
eb30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
eb40: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
eb50: 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65  find DH paramete
eb60: 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  rs file", (char 
eb70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
eb80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
eb90: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
eba0: 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20     }...    dh = 
ebb0: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70  PEM_read_bio_DHp
ebc0: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c  arams(bio, NULL,
ebd0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20   NULL, NULL);.. 
ebe0: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29     BIO_free(bio)
ebf0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
ec00: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
ec10: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54    if (!dh) {...T
ec20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ec30: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
ec40: 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d  ot read DH param
ec50: 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22  eters from file"
ec60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ec70: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
ec80: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
ec90: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20  NULL;..    }..  
eca0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d    SSL_CTX_set_tm
ecb0: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09  p_dh(ctx, dh);..
ecc0: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b      DH_free(dh);
ecd0: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ...} else {..   
ece0: 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f   /* Use well kno
ecf0: 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  wn DH parameters
ed00: 20 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74   that have built
ed10: 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f  -in support in O
ed20: 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69  penSSL */..    i
ed30: 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  f (!SSL_CTX_set_
ed40: 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29  dh_auto(ctx, 1))
ed50: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
ed60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
ed70: 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20  ould not enable 
ed80: 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20  set DH auto: ", 
ed90: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
eda0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
edb0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
edc0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
edd0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
ede0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
edf0: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72    /* set our cer
ee00: 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20  tificate */.    
ee10: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
ee20: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65   = 0;.    if (ce
ee30: 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  rtfile != NULL) 
ee40: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  {..load_private_
ee50: 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53  key = 1;...if (S
ee60: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
ee70: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
ee80: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26   F2N(certfile, &
ee90: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
eea0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
eeb0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
eec0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
eed0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
eee0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
eef0: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
ef00: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
ef10: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54  ile, ": ",...GET
ef20: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
ef30: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
ef40: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
ef50: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
ef60: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c  rn NULL;..}..Tcl
ef70: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
ef80: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
ef90: 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29  f (cert != NULL)
efa0: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65   {..load_private
efb0: 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53  _key = 1;..if (S
efc0: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
efd0: 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c  ficate_ASN1(ctx,
efe0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29   cert_len, cert)
eff0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
f000: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f010: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
f020: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74  o set certificat
f030: 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  e: ",...GET_ERR_
f040: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
f050: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
f060: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f070: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
f080: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
f090: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20  e {..certfile = 
f0a0: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f  (char*)X509_get_
f0b0: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c  default_cert_fil
f0c0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  e();...if (SSL_C
f0d0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
f0e0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72  te_file(ctx, cer
f0f0: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54  tfile, SSL_FILET
f100: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
f110: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f  .#if 0..    Tcl_
f120: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f130: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
f140: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74  use default cert
f150: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
f160: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
f170: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
f180: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f190: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
f1a0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
f1b0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65   return NULL;.#e
f1c0: 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ndif..}.    }.. 
f1d0: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72     /* set our pr
f1e0: 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20  ivate key */.   
f1f0: 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74   if (load_privat
f200: 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65  e_key) {..if (ke
f210: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26  yfile == NULL &&
f220: 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   key == NULL) {.
f230: 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63  .    keyfile = c
f240: 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66  ertfile;..}...if
f250: 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c   (keyfile != NUL
f260: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74  L) {..    /* get
f270: 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79   the private key
f280: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f290: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74   this certificat
f2a0: 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65  e */..    if (ke
f2b0: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  yfile == NULL) {
f2c0: 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72  ...keyfile = cer
f2d0: 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09  tfile;..    }...
f2e0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
f2f0: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66  use_PrivateKey_f
f300: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79  ile(ctx, F2N(key
f310: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f  file, &ds), SSL_
f320: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
f330: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72   0) {...Tcl_DStr
f340: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
f350: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73  /* flush the pas
f360: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69  sphrase which mi
f370: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74  ght be left in t
f380: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54  he result */...T
f390: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
f3a0: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
f3b0: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70  TATIC);...Tcl_Ap
f3c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f3d0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
f3e0: 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c  t public key fil
f3f0: 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20  e ", keyfile, " 
f400: 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52  ",...    GET_ERR
f410: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
f420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
f430: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f440: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
f450: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
f460: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f470: 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65  ...} else if (ke
f480: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  y != NULL) {..  
f490: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73    if (SSL_CTX_us
f4a0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e  e_PrivateKey_ASN
f4b0: 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20  1(EVP_PKEY_RSA, 
f4c0: 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e  ctx, key,key_len
f4d0: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66  ) <= 0) {.../* f
f4e0: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
f4f0: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
f500: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
f510: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
f520: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f530: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
f540: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
f550: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f560: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
f570: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54  blic key: ", GET
f580: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
f590: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f5a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
f5b0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
f5c0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a  L;..    }..}../*
f5d0: 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61   Now we know tha
f5e0: 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74  t a key and cert
f5f0: 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
f600: 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53  gainst.. * the S
f610: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69  SL context */..i
f620: 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63  f (!SSL_CTX_chec
f630: 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74  k_private_key(ct
f640: 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  x)) {..    Tcl_A
f650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f660: 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79  rp, "private key
f670: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f680: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  the certificate 
f690: 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09  public key",....
f6a0: 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55       (char *) NU
f6b0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f6c0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f6d0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f6e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f6f0: 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 75  Set to use defau
f700: 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20  lt location and 
f710: 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 69  file for Certifi
f720: 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 28  cate Authority (
f730: 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 73  CA) certificates
f740: 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 72  . The.     * ver
f750: 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f  ify path and sto
f760: 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  re can be overri
f770: 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f  dden by the SSL_
f780: 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72  CERT_DIR env var
f790: 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 6c  . The verify fil
f7a0: 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 20  e can.     * be 
f7b0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
f7c0: 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20  e SSL_CERT_FILE 
f7d0: 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 20  env var. */.    
f7e0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74  if (!SSL_CTX_set
f7f0: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f  _default_verify_
f800: 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 61  paths(ctx)) {..a
f810: 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  bort++;.    }.. 
f820: 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 20     /* Overrides 
f830: 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 66  for the CA verif
f840: 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  y path and file 
f850: 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 45  */.    {.#if OPE
f860: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
f870: 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
f880: 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d  L..if (CApath !=
f890: 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 20   NULL || CAfile 
f8a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
f8b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b  Tcl_DString ds1;
f8c0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f8d0: 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 20  gInit(&ds1);... 
f8e0: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
f8f0: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61  load_verify_loca
f900: 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43  tions(ctx, F2N(C
f910: 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e  Afile, &ds), F2N
f920: 28 43 41 70 61 74 68 2c 20 26 64 73 31 29 29 29  (CApath, &ds1)))
f930: 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20   {...abort++;.. 
f940: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
f950: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f960: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
f970: 46 72 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20  Free(&ds1);...  
f980: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66    /* Set list of
f990: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20   CAs to send to 
f9a0: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75  client when requ
f9b0: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20  esting a client 
f9c0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
f9d0: 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73      /* https://s
f9e0: 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70  ourceforge.net/p
f9f0: 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f  /tls/bugs/57/ */
fa00: 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44  ..    /* XXX:TOD
fa10: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20  O: Let the user 
fa20: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65  supply values he
fa30: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f  re instead of so
fa40: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69  mething that exi
fa50: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sts on the files
fa60: 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54  ystem */..    ST
fa70: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
fa80: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
fa90: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
faa0: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
fab0: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69  e, &ds));..    i
fac0: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
fad0: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54  NULL) {...SSL_CT
fae0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
faf0: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
fb00: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  mes);..    }..  
fb10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
fb20: 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73  e(&ds);..}..#els
fb30: 65 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d  e..if (CApath !=
fb40: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66   NULL) {..    if
fb50: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f   (!SSL_CTX_load_
fb60: 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 2c 20  verify_dir(ctx, 
fb70: 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 29  F2N(CApath, &ds)
fb80: 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a  )) {...abort++;.
fb90: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
fba0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
fbb0: 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66 69 6c 65  ;..}..if (CAfile
fbc0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
fbd0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
fbe0: 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 63  ad_verify_file(c
fbf0: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
fc00: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74  &ds))) {...abort
fc10: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ++;..    }..    
fc20: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
fc30: 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53  &ds);...    /* S
fc40: 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74  et list of CAs t
fc50: 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74  o send to client
fc60: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
fc70: 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66   a client certif
fc80: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54  icate */..    ST
fc90: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
fca0: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
fcb0: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
fcc0: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
fcd0: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69  e, &ds));..    i
fce0: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
fcf0: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54  NULL) {...SSL_CT
fd00: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
fd10: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
fd20: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  mes);..    }..  
fd30: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
fd40: 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69  e(&ds);..}.#endi
fd50: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  f.    }..    ret
fd60: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn ctx;.}.../*.
fd70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fdb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74  -----. *. * Stat
fdc0: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  usObjCmd -- retu
fdd0: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66  rn certificate f
fde0: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65  or connected pee
fdf0: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
fe00: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
fe10: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
fe20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
fe30: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
fe90: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c  .StatusObjCmd(Cl
fea0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
feb0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
fec0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
fed0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
fee0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
fef0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
ff00: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b  .    X509 *peer;
ff10: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
ff20: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  jPtr;.    Tcl_Ch
ff30: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
ff40: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d  char *channelNam
ff50: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20  e, *ciphers;.   
ff60: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63   int mode;.    c
ff70: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
ff80: 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75  ar *proto;.    u
ff90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b  nsigned int len;
ffa0: 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65  .    int nid, re
ffb0: 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  s;.    (void) cl
ffc0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
ffd0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
ffe0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
fff0: 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20  < 2 || objc > 3 
10000 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26  || (objc == 3 &&
10010 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74   !strcmp(Tcl_Get
10020 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10030 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09   "-local"))) {..
10040 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10050 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
10060 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
10070 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
10080 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10090 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e  .    /* Get chan
100a0 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68  nel Id */.    ch
100b0 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
100c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28  GetString(objv[(
100d0 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20  objc == 2 ? 1 : 
100e0 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d  2)]);.    chan =
100f0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
10100 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e  interp, channelN
10110 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  ame, &mode);.   
10120 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
10130 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
10140 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
10150 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
10160 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
10170 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
10180 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
10190 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
101a0 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
101b0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
101c0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
101d0 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
101e0 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
101f0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
10200 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
10210 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
10220 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
10230 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
10240 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
10250 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
10260 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
10270 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
10280 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41  , "STATUS", "CHA
10290 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
102a0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
102b0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
102c0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
102d0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
102e0 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
102f0 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
10300 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  han);..    /* Ge
10310 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  t certificate fo
10320 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a  r peer or self *
10330 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
10340 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53  = 2) {..peer = S
10350 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74  SL_get_peer_cert
10360 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
10370 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
10380 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  se {..peer = SSL
10390 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65  _get_certificate
103a0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
103b0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65  .    }.    /* Ge
103c0 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  t X509 certifica
103d0 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69  te info */.    i
103e0 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50  f (peer) {..objP
103f0 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
10400 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72  Obj(interp, peer
10410 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  );..if (objc == 
10420 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66  2) {..    X509_f
10430 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20  ree(peer);..    
10440 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  peer = NULL;..}.
10450 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62      } else {..ob
10460 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
10470 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
10480 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65      }..    /* Pe
10490 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c  er name */.    L
104a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
104b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72  p, objPtr, "peer
104c0 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f  name", SSL_get0_
104d0 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74  peername(statePt
104e0 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20  r->ssl), -1);.  
104f0 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
10500 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10510 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63  bits", SSL_get_c
10520 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65  ipher_bits(state
10530 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29  Ptr->ssl, NULL))
10540 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d  ;..    ciphers =
10550 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f   (char*)SSL_get_
10560 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
10570 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45  >ssl);.    LAPPE
10580 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10590 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c  bjPtr, "cipher",
105a0 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a   ciphers, -1);..
105b0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
105c0 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  e X509 certifica
105d0 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20  te presented by 
105e0 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20  the peer */.    
105f0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10600 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
10610 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30  ifyResult",..X50
10620 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
10630 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67  ror_string(SSL_g
10640 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
10650 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
10660 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
10670 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20  erify mode */.  
10680 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74    mode = SSL_get
10690 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61  _verify_mode(sta
106a0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
106b0 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c   if (mode && SSL
106c0 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a  _VERIFY_NONE) {.
106d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
106e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
106f0 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65  rifyMode", "none
10700 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c  ", -1);.    } el
10710 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c  se {..Tcl_Obj *l
10720 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  istObjPtr = Tcl_
10730 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
10740 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26  LL);..if (mode &
10750 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  & SSL_VERIFY_PEE
10760 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  R) {..    Tcl_Li
10770 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10780 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
10790 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
107a0 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20  ringObj("peer", 
107b0 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f  -1));..}..if (mo
107c0 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
107d0 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
107e0 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63  _CERT) {..    Tc
107f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10800 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10810 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10820 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69  ewStringObj("fai
10830 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72  l if no peer cer
10840 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
10850 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10860 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
10870 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
10880 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10890 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
108a0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
108b0 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f  ingObj("client o
108c0 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  nce", -1));..}..
108d0 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
108e0 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
108f0 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63  SHAKE) {..    Tc
10900 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10910 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10920 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10930 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73  ewStringObj("pos
10940 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31  t handshake", -1
10950 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  ));..}..LAPPEND_
10960 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OBJ(interp, objP
10970 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22  tr, "verifyMode"
10980 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20  , listObjPtr).  
10990 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69    }..    /* Veri
109a0 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f  fy mode depth */
109b0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
109c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
109d0 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20   "verifyDepth", 
109e0 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64  SSL_get_verify_d
109f0 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73  epth(statePtr->s
10a00 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  sl));..    /* Re
10a10 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
10a20 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
10a30 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65  result of the ne
10a40 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  gotiation */.   
10a50 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73   SSL_get0_alpn_s
10a60 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
10a70 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
10a80 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
10a90 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10aa0 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63  jPtr, "alpn", (c
10ab0 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63  har *)proto, (Tc
10ac0 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20  l_Size) len);.  
10ad0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10ae0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10af0 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
10b00 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50  t_version(stateP
10b10 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  tr->ssl), -1);..
10b20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72      /* Valid for
10b30 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75   non-RSA signatu
10b40 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a  re and TLS 1.3 *
10b50 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
10b60 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
10b70 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
10b80 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
10b90 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10ba0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
10bb0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
10bc0 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
10bd0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10be0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65     }.    if (!re
10bf0 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20  s) {nid = 0;}.  
10c00 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10c10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10c20 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f  ignatureHashAlgo
10c30 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32  rithm", OBJ_nid2
10c40 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20  ln(nid), -1);.. 
10c50 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
10c60 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  ) {..res = SSL_g
10c70 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72  et_peer_signatur
10c80 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
10c90 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
10ca0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
10cb0 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67  es = SSL_get_sig
10cc0 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
10cd0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10ce0 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nid);.    }.    
10cf0 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d  if (!res) {nid =
10d00 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44   0;}.    LAPPEND
10d10 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10d20 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54  Ptr, "signatureT
10d30 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e  ype", OBJ_nid2ln
10d40 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  (nid), -1);..   
10d50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10d60 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10d70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10d80 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dd0 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74  --. *. * Connect
10de0 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d  ionInfoObjCmd --
10df0 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69   return connecti
10e00 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65  on info from Ope
10e10 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
10e20 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f  lts:. *.A list o
10e30 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  f connection inf
10e40 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  o.  *. *--------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
10e90 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e  .static int Conn
10ea0 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
10eb0 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
10ec0 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
10ed0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
10ee0 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
10ef0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
10f00 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
10f10 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
10f20 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
10f30 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61  de on */.    Sta
10f40 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
10f50 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
10f60 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
10f70 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
10f80 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a  jPtr, *listPtr;.
10f90 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73      const SSL *s
10fa0 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  sl;.    const SS
10fb0 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  L_CIPHER *cipher
10fc0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
10fd0 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
10fe0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
10ff0 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69  MD *md;.    (voi
11000 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
11010 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
11020 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
11030 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11040 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
11050 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
11060 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
11070 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
11080 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
11090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
110a0 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
110b0 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
110c0 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
110d0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
110e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
110f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11100 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
11110 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
11120 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
11130 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
11140 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
11150 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
11160 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
11170 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
11180 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
11190 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
111a0 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
111b0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
111c0 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
111d0 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
111e0 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
111f0 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
11200 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
11210 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49  "TLS", "CONNECTI
11220 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  ON", "CHANNEL", 
11230 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
11240 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
11250 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11260 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20    }..    objPtr 
11270 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
11280 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  (0, NULL);..    
11290 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  /* Connection in
112a0 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  fo */.    stateP
112b0 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
112c0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
112d0 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
112e0 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50      ssl = stateP
112f0 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20  tr->ssl;.    if 
11300 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl != NULL) {.
11310 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ./* connection s
11320 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  tate */..LAPPEND
11330 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11340 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53  Ptr, "state", SS
11350 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c  L_state_string_l
11360 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  ong(ssl), -1);..
11370 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75  ./* Get SNI requ
11380 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d  ested server nam
11390 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  e */..LAPPEND_ST
113a0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
113b0 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20  , "servername", 
113c0 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
113d0 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
113e0 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
113f0 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  e), -1);.../* Ge
11400 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c  t protocol */..L
11410 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11420 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
11430 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76  ocol", SSL_get_v
11440 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29  ersion(ssl), -1)
11450 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61  ;.../* Renegotia
11460 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  tion allowed */.
11470 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
11480 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
11490 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c  enegotiation_all
114a0 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73  owed", SSL_get_s
114b0 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74  ecure_renegotiat
114c0 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c  ion_support((SSL
114d0 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20   *) ssl));.../* 
114e0 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76  Get security lev
114f0 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49  el */..LAPPEND_I
11500 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
11510 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76  r, "security_lev
11520 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63  el", SSL_get_sec
11530 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29  urity_level(ssl)
11540 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
11550 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  info */..LAPPEND
11560 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
11570 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72  jPtr, "session_r
11580 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73  eused", SSL_sess
11590 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29  ion_reused(ssl))
115a0 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72  ;.../* Is server
115b0 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
115c0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
115d0 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65  bjPtr, "is_serve
115e0 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65  r", SSL_is_serve
115f0 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  r(ssl));.../* Is
11600 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e   DTLS */..LAPPEN
11610 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11620 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22  bjPtr, "is_dtls"
11630 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73  , SSL_is_dtls(ss
11640 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  l));.    }..    
11650 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a  /* Cipher info *
11660 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53  /.    cipher = S
11670 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
11680 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20  ipher(ssl);.    
11690 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55  if (cipher != NU
116a0 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b  LL) {..char buf[
116b0 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09  BUFSIZ] = {0};..
116c0 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69  int bits, alg_bi
116d0 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  ts;.../* Cipher 
116e0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
116f0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11700 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53  Ptr, "cipher", S
11710 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
11720 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
11730 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f  .../* RFC name o
11740 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
11750 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11760 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61   objPtr, "standa
11770 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49  rd_name", SSL_CI
11780 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
11790 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
117a0 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61  .../* OpenSSL na
117b0 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
117c0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
117d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70  erp, objPtr, "op
117e0 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45  enssl_name", OPE
117f0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65  NSSL_cipher_name
11800 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e  (SSL_CIPHER_stan
11810 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
11820 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75  )), -1);.../* nu
11830 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62  mber of secret b
11840 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70  its used for cip
11850 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53  her */..bits = S
11860 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
11870 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
11880 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
11890 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
118a0 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73  tr, "secret_bits
118b0 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  ", bits);..LAPPE
118c0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
118d0 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68  bjPtr, "algorith
118e0 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74  m_bits", alg_bit
118f0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  s);../* alg_bits
11900 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
11910 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
11920 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
11930 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
11940 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20  its differ,..   
11950 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
11960 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
11970 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
11980 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
11990 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a  (bits < 56) */..
119a0 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68  ./* Indicates wh
119b0 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74  ich SSL/TLS prot
119c0 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72  ocol version fir
119d0 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63  st defined the c
119e0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
119f0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11a00 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69  jPtr, "min_versi
11a10 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  on", SSL_CIPHER_
11a20 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
11a30 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43  er), -1);.../* C
11a40 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41  ipher NID */..LA
11a50 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11a60 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11a70 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  rNID", (char *)O
11a80 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
11a90 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f  PHER_get_cipher_
11aa0 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11ab0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11ac0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11ad0 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68  "digestNID", (ch
11ae0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
11af0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64  SSL_CIPHER_get_d
11b00 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72  igest_nid(cipher
11b10 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
11b20 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11b30 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e  jPtr, "keyExchan
11b40 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  geNID", (char *)
11b50 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
11b60 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64  IPHER_get_kx_nid
11b70 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
11b80 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11b90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75  erp, objPtr, "au
11ba0 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22  thenticationNID"
11bb0 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11bc0 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11bd0 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70  get_auth_nid(cip
11be0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
11bf0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
11c00 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43  ication code - C
11c10 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65  ipher is AEAD (e
11c20 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68  .g. GCM or ChaCh
11c30 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72  a20/Poly1305) or
11c40 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68   not */../* Auth
11c50 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70  enticated Encryp
11c60 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69  tion with associ
11c70 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29  ated data (AEAD)
11c80 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45   check */..LAPPE
11c90 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
11ca0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
11cb0 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49  is_aead", SSL_CI
11cc0 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70  PHER_is_aead(cip
11cd0 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65  her));.../* Dige
11ce0 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  st used during t
11cf0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73  he SSL/TLS hands
11d00 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20  hake when using 
11d10 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09  the cipher. */..
11d20 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  md = SSL_CIPHER_
11d30 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69  get_handshake_di
11d40 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c  gest(cipher);..L
11d50 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11d60 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64  p, objPtr, "hand
11d70 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28  shake_digest", (
11d80 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61  char *)EVP_MD_na
11d90 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f  me(md), -1);.../
11da0 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70  * Get OpenSSL-sp
11db0 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49  ecific ID, not I
11dc0 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45  ANA ID */..LAPPE
11dd0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11de0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
11df0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
11e00 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
11e10 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62  er));.../* Two-b
11e20 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74  yte ID used in t
11e30 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  he TLS protocol 
11e40 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70  of the given cip
11e50 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
11e60 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
11e70 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64  tr, "protocol_id
11e80 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
11e90 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c  HER_get_protocol
11ea0 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
11eb0 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72  /* Textual descr
11ec0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
11ed0 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c  pher */..if (SSL
11ee0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
11ef0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
11f00 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
11f10 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
11f20 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11f30 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
11f40 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
11f50 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
11f60 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
11f70 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
11f80 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
11f90 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
11fa0 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
11fb0 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
11fc0 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
11fd0 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
11fe0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
11ff0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
12000 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
12010 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e  _id, *proto;..un
12020 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66  signed char buff
12030 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  er[SSL_MAX_MASTE
12040 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a  R_KEY_LENGTH];..
12050 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
12060 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
12070 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
12080 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61  the ALPN negotia
12090 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  tion */..SSL_SES
120a0 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  SION_get0_alpn_s
120b0 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c  elected(session,
120c0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b   &proto, &len2);
120d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
120e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
120f0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70  lpn", (char *) p
12100 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
12110 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70   len2);.../* Rep
12120 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
12130 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
12140 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e  esult of the NPN
12150 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
12160 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
12170 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72  SSL_get0_next_pr
12180 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73  oto_negotiated(s
12190 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65  sl, &proto, &ule
121a0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
121b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
121c0 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29   "npn", (char *)
121d0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
121e0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66  e) ulen);.#endif
121f0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20  .../* Resumable 
12200 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50  session */..LAPP
12210 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
12220 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61   objPtr, "resuma
12230 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ble", SSL_SESSIO
12240 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73  N_is_resumable(s
12250 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
12260 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
12270 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
12280 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50   epoch) */..LAPP
12290 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
122a0 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f   objPtr, "start_
122b0 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
122c0 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73  ON_get_time(sess
122d0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  ion));.../* Time
122e0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
122f0 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
12300 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
12310 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
12320 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
12330 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53  imeout", SSL_SES
12340 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74  SION_get_timeout
12350 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
12360 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c   Session id - TL
12370 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20  Sv1.2 and below 
12380 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  only */..session
12390 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
123a0 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
123b0 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
123c0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
123d0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
123e0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f  on_id", session_
123f0 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
12400 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  len);.../* Sessi
12410 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  on context */..s
12420 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
12430 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f  SESSION_get0_id_
12440 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c  context(session,
12450 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
12460 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
12470 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
12480 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73  n_context", sess
12490 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
124a0 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
124b0 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20  ession ticket - 
124c0 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09  client only */..
124d0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
124e0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c  _ticket(session,
124f0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
12500 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
12510 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
12520 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65  , "session_ticke
12530 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  t", ticket, (Tcl
12540 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
12550 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
12560 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20  t lifetime hint 
12570 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
12580 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
12590 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c  terp, objPtr, "l
125a0 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  ifetime", SSL_SE
125b0 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74  SSION_get_ticket
125c0 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73  _lifetime_hint(s
125d0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
125e0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a  icket app data *
125f0 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
12600 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
12610 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f  x30000000L..SSL_
12620 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
12630 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c  ket_appdata((SSL
12640 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73  _SESSION *) sess
12650 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
12660 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
12670 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
12680 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70  jPtr, "ticket_ap
12690 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c  p_data", ticket,
126a0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
126b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47  );.#endif.../* G
126c0 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f  et master key */
126d0 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53  ..len2 = SSL_SES
126e0 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f  SION_get_master_
126f0 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66  key(session, buf
12700 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53  fer, SSL_MAX_MAS
12710 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b  TER_KEY_LENGTH);
12720 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
12730 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12740 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62   "master_key", b
12750 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65  uffer, (Tcl_Size
12760 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f  ) len2);.../* Co
12770 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  mpression id */.
12780 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64  .unsigned int id
12790 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
127a0 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73  et_compress_id(s
127b0 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e  ession);..LAPPEN
127c0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
127d0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
127e0 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20  on_id", id == 1 
127f0 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65  ? "zlib" : "none
12800 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ", -1);.    }.. 
12810 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
12820 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
12830 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
12840 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
12850 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
12860 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
12870 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
12880 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
12890 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
128a0 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
128b0 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
128c0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
128d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
128e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
128f0 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d  ompression", com
12900 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  p ? SSL_COMP_get
12910 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e  _name(comp) : "n
12920 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
12930 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12940 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
12950 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f  on", expn ? SSL_
12960 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78  COMP_get_name(ex
12970 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  pn) : "none", -1
12980 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e  );.#else..LAPPEN
12990 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
129a0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
129b0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
129c0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
129d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
129e0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e  expansion", "non
129f0 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  e", -1);.#endif.
12a00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
12a10 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
12a20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20   {..long mode = 
12a30 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73  SSL_CTX_get_sess
12a40 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
12a50 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
12a60 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20  char *msg;...if 
12a70 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
12a80 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20  _CACHE_OFF) {.. 
12a90 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a     msg = "off";.
12aa0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
12ab0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12ac0 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20  E_CLIENT) {..   
12ad0 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b   msg = "client";
12ae0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
12af0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
12b00 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20  HE_SERVER) {..  
12b10 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22    msg = "server"
12b20 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12b30 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12b40 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20  CHE_BOTH) {..   
12b50 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09   msg = "both";..
12b60 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73  } else {..    ms
12b70 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09  g = "unknown";..
12b80 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  }..LAPPEND_STR(i
12b90 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12ba0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
12bb0 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  de", msg, -1);. 
12bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20     }..    /* CA 
12bd0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  List */.    /* I
12be0 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20  F not a server, 
12bf0 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30  same as SSL_get0
12c00 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49  _peer_CA_list. I
12c10 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73  f server same as
12c20 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69   SSL_CTX_get_cli
12c30 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20  ent_CA_list */. 
12c40 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c     listPtr = Tcl
12c50 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
12c60 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f  ULL);.    STACK_
12c70 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
12c80 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28  a_list;.    if (
12c90 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67  (ca_list = SSL_g
12ca0 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
12cb0 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29  t(ssl)) != NULL)
12cc0 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b   {..char buffer[
12cd0 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69  BUFSIZ];..for (i
12ce0 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
12cf0 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63  _X509_NAME_num(c
12d00 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a  a_list); i++) {.
12d10 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a  .    X509_NAME *
12d20 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e  name = sk_X509_N
12d30 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73  AME_value(ca_lis
12d40 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28  t, i);..    if (
12d50 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e  name) {...X509_N
12d60 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65  AME_oneline(name
12d70 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
12d80 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  );...Tcl_ListObj
12d90 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12da0 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
12db0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12dc0 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20  buffer, -1));.. 
12dd0 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20     }..}.    }.  
12de0 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
12df0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
12e00 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29  aList", listPtr)
12e10 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  ;.    LAPPEND_IN
12e20 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
12e30 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c  , "caListCount",
12e40 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
12e50 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20  m(ca_list));..  
12e60 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
12e70 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
12e80 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
12e90 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ee0 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f  ---. *. * Versio
12ef0 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  nObjCmd -- retur
12f00 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  n version string
12f10 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
12f20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
12f30 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
12f40 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
12f50 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
12f60 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
12fc0 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  sionObjCmd(Clien
12fd0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
12fe0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
12ff0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
13000 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
13010 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
13020 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
13030 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
13040 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  ata;.    (void) 
13050 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29  objc;.    (void)
13060 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69   objv;..    dpri
13070 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
13080 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
13090 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50  _NewStringObj(OP
130a0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45  ENSSL_VERSION_TE
130b0 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c  XT, -1);.    Tcl
130c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
130d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a  terp, objPtr);..
130e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
130f0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13140 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64   *. * MiscObjCmd
13150 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64   -- misc command
13160 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
13170 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
13180 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
13190 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
131a0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131f0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
13200 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  MiscObjCmd(Clien
13210 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
13220 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
13230 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
13240 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
13250 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61  bjv[]) {.    sta
13260 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
13270 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20  commands [] = { 
13280 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c  "req", "strreq",
13290 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75   NULL };.    enu
132a0 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45  m command { C_RE
132b0 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44  Q, C_STRREQ, C_D
132c0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f  UMMY };.    Tcl_
132d0 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e  Size cmd;.    in
132e0 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  t isStr;.    cha
132f0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
13300 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
13310 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
13320 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
13330 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
13340 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
13350 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
13360 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
13370 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
13380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13390 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
133a0 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
133b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
133c0 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
133d0 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64  ommand", 0, &cmd
133e0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
133f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13400 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
13410 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
13420 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
13430 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
13440 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
13450 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
13460 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
13470 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
13480 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
13490 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
134a0 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
134b0 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
134c0 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
134d0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
134e0 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  ;..    Tcl_Size 
134f0 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20  listc;..    int 
13500 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75  i;...    BIO *ou
13510 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68  t=NULL;...    ch
13520 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54  ar *k_C="",*k_ST
13530 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f  ="",*k_L="",*k_O
13540 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f  ="",*k_OU="",*k_
13550 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22  CN="",*k_Email="
13560 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65  ";..    char *ke
13570 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74  yout,*pemout,*st
13580 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73  r;..    int keys
13590 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79  ize,serial=0,day
135a0 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e  s=365;..#if OPEN
135b0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
135c0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
135d0 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e  ..    BIGNUM *bn
135e0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52  e = NULL;..    R
135f0 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a  SA *rsa = NULL;.
13600 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50  #else..    EVP_P
13610 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  KEY_CTX *ctx = N
13620 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20  ULL;.#endif...  
13630 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c    if ((objc<5) |
13640 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09  | (objc>6)) {...
13650 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13660 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
13670 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69  , "keysize keyfi
13680 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66  le certfile ?inf
13690 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  o?");...return T
136a0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
136b0 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ...    if (Tcl_G
136c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
136d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b  erp, objv[2], &k
136e0 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f  eysize) != TCL_O
136f0 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
13700 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
13710 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f  .    keyout=Tcl_
13720 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
13730 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d  ]);..    pemout=
13740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13750 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20  jv[4]);..    if 
13760 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f  (isStr) {...Tcl_
13770 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
13780 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63  yout,"",0);...Tc
13790 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
137a0 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20  pemout,"",0);.. 
137b0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f     }...    if (o
137c0 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28  bjc>=6) {...if (
137d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
137e0 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
137f0 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20  bjv[5], &listc, 
13800 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
13810 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
13820 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
13830 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
13840 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
13850 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
13860 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
13870 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
13880 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
13890 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
138a0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
138b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
138c0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
138d0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
138e0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
138f0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
13900 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
13910 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
13920 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
13930 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13940 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
13950 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
13960 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13970 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
13980 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13990 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
139a0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
139b0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
139c0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
139d0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
139e0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
139f0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
13a00 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13a10 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
13a20 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
13a30 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13a40 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13a50 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
13a60 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
13a70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13a80 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13a90 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13aa0 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
13ab0 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
13ac0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13ad0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13ae0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13af0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
13b00 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
13b10 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13b20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13b30 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
13b40 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
13b50 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
13b60 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
13b70 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13b80 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
13b90 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
13ba0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13bb0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13bc0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13bd0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
13be0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
13bf0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13c00 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13c10 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
13c20 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
13c30 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
13c40 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
13c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
13c60 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
13c70 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
13c80 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
13c90 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
13ca0 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
13cb0 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
13cc0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
13cd0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
13ce0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
13cf0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
13d00 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
13d10 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
13d20 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
13d30 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
13d40 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
13d50 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
13d60 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
13d70 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
13d80 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
13d90 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
13da0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
13db0 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
13dc0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
13dd0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
13de0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
13df0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
13e00 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
13e10 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
13e20 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
13e30 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
13e40 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
13e50 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
13e60 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
13e70 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
13e80 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
13e90 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
13ea0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
13eb0 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
13ec0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
13ed0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
13ee0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
13ef0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
13f00 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
13f10 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
13f20 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
13f30 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
13f40 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
13f50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13f60 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
13f70 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
13f80 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
13f90 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
13fa0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
13fb0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
13fc0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
13fd0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
13fe0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
13ff0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
14000 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
14010 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
14020 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
14030 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
14040 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
14050 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
14060 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
14070 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
14080 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
14090 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
140a0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
140b0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
140c0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
140d0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
140e0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
140f0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
14100 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
14110 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
14120 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
14130 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
14140 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
14150 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
14160 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
14170 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
14180 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
14190 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
141a0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
141b0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
141c0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
141d0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
141e0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
141f0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
14200 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
14210 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
14220 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
14230 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
14240 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
14250 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
14260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
14270 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65  }....X509_set_ve
14280 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09  rsion(cert,2);..
14290 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65  .ASN1_INTEGER_se
142a0 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61  t(X509_get_seria
142b0 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65  lNumber(cert),se
142c0 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d  rial);...X509_gm
142d0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
142e0 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72  tm_notBefore(cer
142f0 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d  t),0);...X509_gm
14300 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
14310 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74  tm_notAfter(cert
14320 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34  ),(long)60*60*24
14330 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73  *days);...X509_s
14340 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70  et_pubkey(cert,p
14350 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35  key);....name=X5
14360 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_get_subject_n
14370 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35  ame(cert);....X5
14380 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14390 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
143a0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
143b0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
143c0 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31   char *) k_C, -1
143d0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
143e0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
143f0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22  by_txt(name,"ST"
14400 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
14410 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14420 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31  char *) k_ST, -1
14430 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14440 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14450 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c  by_txt(name,"L",
14460 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14470 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14480 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20  har *) k_L, -1, 
14490 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
144a0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
144b0 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d  _txt(name,"O", M
144c0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
144d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
144e0 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31  r *) k_O, -1, -1
144f0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
14500 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14510 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42  xt(name,"OU", MB
14520 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
14530 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14540 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31   *) k_OU, -1, -1
14550 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
14560 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
14570 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42  xt(name,"CN", MB
14580 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
14590 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
145a0 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31   *) k_CN, -1, -1
145b0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
145c0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
145d0 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c  xt(name,"Email",
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 45 6d 61 69 6c 2c 20  har *) k_Email, 
14610 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58  -1, -1, 0);....X
14620 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f  509_set_subject_
14630 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b  name(cert,name);
14640 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69  ....if (!X509_si
14650 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50  gn(cert,pkey,EVP
14660 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09  _sha256())) {...
14670 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65      X509_free(ce
14680 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  rt);...    EVP_P
14690 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
146a0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
146b0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
146c0 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
146d0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
146e0 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  dif...    Tcl_Se
146f0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
14700 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65  Error signing ce
14710 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29  rtificate",NULL)
14720 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
14730 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
14740 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09  .if (isStr) {...
14750 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
14760 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09  BIO_s_mem());...
14770 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
14780 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29  o_X509(out,cert)
14790 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
147a0 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
147b0 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
147c0 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
147d0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
147e0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
147f0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
14800 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66  nterp,pemout,buf
14810 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
14820 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
14830 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
14840 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
14850 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
14860 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
14870 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
14880 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f  ilename(out,pemo
14890 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
148a0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
148b0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42  t,cert);...    B
148c0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
148d0 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72  ;...}....X509_fr
148e0 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f  ee(cert);...EVP_
148f0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
14900 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
14910 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
14920 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66  30000000L...BN_f
14930 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
14940 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61  ..    }..}..brea
14950 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
14960 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20  .break;.    }.  
14970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
14980 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49  **********/./* I
149a0 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
149b0 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
149c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a10 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72  ---. *. * Tls_Fr
14a20 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
14a30 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
14a40 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
14a50 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
14a60 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
14a70 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
14a80 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
14a90 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65  below 1. *. * Re
14aa0 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
14ab0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
14ac0 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
14ad0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b20 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
14b30 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b  Free(char *block
14b40 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
14b50 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
14b60 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
14b70 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
14b80 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
14b90 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
14ba0 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
14bb0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
14bc0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c00 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
14c10 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
14c20 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
14c30 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
14c40 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
14c50 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
14c60 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
14c70 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
14c80 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
14c90 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
14ca0 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
14cb0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
14cc0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
14cd0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
14ce0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
14cf0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
14d00 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
14d10 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
14d20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
14d30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d70 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
14d80 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
14d90 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
14da0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
14db0 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
14dc0 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
14dd0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
14de0 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
14df0 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
14e00 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
14e10 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
14e20 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
14e30 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
14e40 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
14e50 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
14e60 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
14e70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
14e80 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14e90 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
14ea0 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
14eb0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14ec0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14ed0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14ee0 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
14ef0 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
14f00 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
14f10 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
14f20 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
14f30 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
14f40 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
14f50 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
14f60 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
14f70 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
14f80 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14f90 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
14fa0 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
14fb0 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
14fc0 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
14fd0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
14fe0 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
14ff0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
15000 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
15010 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
15020 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
15030 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
15040 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
15050 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
15060 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
15070 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
15080 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
15090 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
150a0 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
150b0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
150c0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
150d0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
150e0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
150f0 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
15100 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
15110 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
15120 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
15130 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
15140 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
15150 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
15160 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
15170 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
15180 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
15190 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
151a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151e0 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66  . *. * Build Inf
151f0 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a  o Command --. *.
15200 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e   *.Create comman
15210 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c  d to return buil
15220 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61  d info for packa
15230 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ge.. *. * Result
15240 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
15250 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20   Tcl result. *. 
15260 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
15270 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64   *.Created build
15280 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20  -info command.. 
15290 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
152e0 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46  #ifndef STRINGIF
152f0 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  Y.#  define STRI
15300 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49  NGIFY(x) STRINGI
15310 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65  FY1(x).#  define
15320 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23   STRINGIFY1(x) #
15330 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75  x.#endif..int.Bu
15340 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54  ildInfoCommand(T
15350 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72  cl_Interp* inter
15360 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64  p) {.    Tcl_Cmd
15370 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20  Info info;..    
15380 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  if (Tcl_GetComma
15390 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22  ndInfo(interp, "
153a0 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66  ::tcl::build-inf
153b0 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54  o", &info)) {..T
153c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
153d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
153e0 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c  ls::build-info",
153f0 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28   info.objProc, (
15400 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41  void *)(...PACKA
15410 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53  GE_VERSION "+" S
15420 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52  TRINGIFY(TLS_VER
15430 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64  SION_UUID).#if d
15440 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
15450 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63  ) && defined(__c
15460 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09  lang_major__)...
15470 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53  .    ".clang-" S
15480 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67  TRINGIFY(__clang
15490 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f  _major__).#if __
154a0 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20  clang_minor__ < 
154b0 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65  10....    "0".#e
154c0 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49  ndif....    STRI
154d0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69  NGIFY(__clang_mi
154e0 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  nor__).#endif.#i
154f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75  f defined(__cplu
15500 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e  splus) && !defin
15510 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09  ed(__OBJC__)....
15520 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22      ".cplusplus"
15530 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
15540 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e  NDEBUG....    ".
15550 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69  debug".#endif.#i
15560 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  f !defined(__cla
15570 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  ng__) && !define
15580 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  d(__INTEL_COMPIL
15590 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  ER) && defined(_
155a0 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20  _GNUC__)....    
155b0 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46  ".gcc-" STRINGIF
155c0 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20  Y(__GNUC__).#if 
155d0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c  __GNUC_MINOR__ <
155e0 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23   10....    "0".#
155f0 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52  endif....    STR
15600 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49  INGIFY(__GNUC_MI
15610 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  NOR__).#endif.#i
15620 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d  fdef __INTEL_COM
15630 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69  PILER....    ".i
15640 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  cc-" STRINGIFY(_
15650 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29  _INTEL_COMPILER)
15660 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54  .#endif.#ifdef T
15670 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09  CL_MEM_DEBUG....
15680 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a      ".memdebug".
15690 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
156a0 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09  ed(_MSC_VER)....
156b0 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52      ".msvc-" STR
156c0 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29  INGIFY(_MSC_VER)
156d0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55  .#endif.#ifdef U
156e0 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20  SE_NMAKE....    
156f0 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a  ".nmake".#endif.
15700 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f  #ifndef TCL_CFG_
15710 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20  OPTIMIZED....   
15720 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a   ".no-optimize".
15730 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
15740 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e  OBJC__....    ".
15750 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66  objective-c".#if
15760 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73   defined(__cplus
15770 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c  plus)....    "pl
15780 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23  usplus".#endif.#
15790 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c  endif.#ifdef TCL
157a0 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09  _CFG_PROFILED...
157b0 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a  .    ".profile".
157c0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55  #endif.#ifdef PU
157d0 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75  RIFY....    ".pu
157e0 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66  rify".#endif.#if
157f0 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44  def STATIC_BUILD
15800 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63  ....    ".static
15810 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55  ".#endif...), NU
15820 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  LL);.    }.    r
15830 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15840 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
15890 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a   Tls_Init --. *.
158a0 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
158b0 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
158c0 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77  ion procedure, w
158d0 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20  hich is called. 
158e0 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68  *.by Tcl when th
158f0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f  is package is to
15900 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20   be added to an 
15910 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a  interpreter.. *.
15920 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c   * Results:  Ssl
15930 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
15940 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64  loaded. *. * Sid
15950 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63  e effects:. *. c
15960 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f  reate the ssl co
15970 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a  mmand, initializ
15980 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a  e ssl context. *
15990 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
159a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159d0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20  ------. */..#if 
159e0 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
159f0 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49  N > 8.#define MI
15a00 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a  N_VERSION "9.0".
15a10 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49  #else.#define MI
15a20 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a  N_VERSION "8.5".
15a30 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63  #endif..static c
15a40 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
15a50 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
15a60 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
15a70 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
15a80 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e  };..DLLEXPORT in
15a90 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49  t Tls_Init(Tcl_I
15aa0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
15ab0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
15ac0 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66  alled");..#ifdef
15ad0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20   USE_TCL_STUBS. 
15ae0 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53     if (Tcl_InitS
15af0 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e  tubs(interp, MIN
15b00 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20  _VERSION, 0) == 
15b10 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
15b20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15b30 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28  .#endif.    if (
15b40 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69  Tcl_PkgRequire(i
15b50 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49  nterp, "Tcl", MI
15b60 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d  N_VERSION, 0) ==
15b70 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
15b80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15b90 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69  }..    if (TlsLi
15ba0 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f  bInit(0) != TCL_
15bb0 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  OK) {..Tcl_Appen
15bc0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15bd0 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69  "could not initi
15be0 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72  alize SSL librar
15bf0 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  y", (char *) NUL
15c00 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
15c10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
15c20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15c30 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15c40 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c  ::tls::ciphers",
15c50 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20   CiphersObjCmd, 
15c60 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15c70 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15c80 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15c90 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15ca0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15cb0 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74   "::tls::connect
15cc0 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e  ion", Connection
15cd0 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  InfoObjCmd, (Cli
15ce0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15cf0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15d00 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15d10 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15d20 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
15d30 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c  tls::handshake",
15d40 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
15d50 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
15d60 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15d70 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15d80 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15d90 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15da0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72  p, "::tls::impor
15db0 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  t", ImportObjCmd
15dc0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
15dd0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15de0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15df0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15e00 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15e10 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70  p, "::tls::unimp
15e20 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ort", UnimportOb
15e30 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15e40 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
15e50 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15e60 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15e70 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15e80 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73  nterp, "::tls::s
15e90 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62  tatus", StatusOb
15ea0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15eb0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
15ec0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
15ed0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
15ee0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
15ef0 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76  nterp, "::tls::v
15f00 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e  ersion", Version
15f10 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15f20 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
15f30 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15f40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15f50 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15f60 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
15f70 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43  :misc", MiscObjC
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 70 72 6f  erp, "::tls::pro
15fe0 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f  tocols", Protoco
15ff0 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  lsObjCmd, (Clien
16000 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
16010 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
16020 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42  *) NULL);..    B
16030 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28  uildInfoCommand(
16040 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66  interp);..    if
16050 20 28 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f   (interp && Tcl_
16060 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73  Eval(interp, tls
16070 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21  TclInitScript) !
16080 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
16090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
160a0 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
160b0 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
160c0 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f  interp, PACKAGE_
160d0 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45  NAME, PACKAGE_VE
160e0 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  RSION);.}../*. *
160f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16120 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c  ------*. *. *.Tl
16130 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a  s_SafeInit --. *
16140 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
16150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16170 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72  ----*. *.Standar
16180 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75  d procedure requ
16190 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a  ired by 'load'..
161a0 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74   *.Initializes t
161b0 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f  his extension fo
161c0 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72  r a safe interpr
161d0 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  eter.. *.-------
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
16210 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20  .Side effects:. 
16220 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e  *..As of 'Tls_In
16230 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  it'. *. *.Result
16240 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64  :. *..A standard
16250 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e   Tcl error code.
16260 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
162a0 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  /.DLLEXPORT int 
162b0 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  Tls_SafeInit(Tcl
162c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
162d0 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
162e0 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  Called");.    re
162f0 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e  turn Tls_Init(in
16300 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  terp);.}../*. *-
16310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16340 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
16350 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  LibInit --. *. *
16360 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16390 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  -*. *.Initialize
163a0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e  s SSL library on
163b0 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69  ce per applicati
163c0 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  on. *.----------
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 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
16400 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
16410 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  initializes SSL 
16420 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65  library. *. *.Re
16430 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20  sult:. *..none. 
16440 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
16480 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69  static int TlsLi
16490 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
164a0 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74  ialize) {.    st
164b0 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c  atic int initial
164c0 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ized = 0;.    in
164d0 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f  t status = TCL_O
164e0 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  K;.#if defined(O
164f0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16500 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16510 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65  HREADS).    size
16520 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65  _t num_locks;.#e
16530 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e  ndif..    if (un
16540 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69  initialize) {..i
16550 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29  f (!initialized)
16560 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
16570 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74  "Asked to uninit
16580 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61  ialize, but we a
16590 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  re not initializ
165a0 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75  ed");...    retu
165b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09  rn TCL_OK;..}...
165c0 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
165d0 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29  o uninitialize")
165e0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
165f0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16600 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16610 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
16620 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
16630 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b  ;...if (locks) {
16640 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73  ..    free(locks
16650 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20  );..    locks = 
16660 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73  NULL;..    locks
16670 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65  Count = 0;..}.#e
16680 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65  ndif..initialize
16690 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69  d = 0;..#if defi
166a0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
166b0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
166c0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
166d0 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69  l_MutexUnlock(&i
166e0 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
166f0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  ..return TCL_OK;
16700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
16710 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
16720 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
16730 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
16740 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75  d value");..retu
16750 72 6e 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d  rn status;.    }
16760 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
16770 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
16780 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
16790 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
167a0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
167b0 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b     Tcl_MutexLock
167c0 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
167d0 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a  if.    initializ
167e0 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66  ed = 1;..#if def
167f0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
16800 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
16810 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
16820 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b    num_locks = 1;
16830 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20  .    locksCount 
16840 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b  = (int) num_lock
16850 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d  s;.    locks = m
16860 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f  alloc(sizeof(*lo
16870 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
16880 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f  );.    memset(lo
16890 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  cks, 0, sizeof(*
168a0 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
168b0 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ks);.#endif..   
168c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42   /* Initialize B
168d0 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e  OTH libcrypto an
168e0 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20  d libssl. */.   
168f0 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73   OPENSSL_init_ss
16900 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  l(OPENSSL_INIT_L
16910 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20  OAD_SSL_STRINGS 
16920 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  | OPENSSL_INIT_L
16930 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e  OAD_CRYPTO_STRIN
16940 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  GS..| OPENSSL_IN
16950 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45  IT_ADD_ALL_CIPHE
16960 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  RS | OPENSSL_INI
16970 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54  T_ADD_ALL_DIGEST
16980 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42  S, NULL);..    B
16990 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c  IO_new_tcl(NULL,
169a0 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20   0);..#if 0.    
169b0 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f  /*.     * XXX:TO
169c0 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20  DO: Remove this 
169d0 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65  code and replace
169e0 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b   it with a check
169f0 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75  .     * for enou
16a00 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64  gh entropy and d
16a10 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65  o not try to cre
16a20 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20  ate our own.    
16a30 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72   * terrible entr
16a40 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  opy.     */.    
16a50 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74  /*.     * Seed t
16a60 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
16a70 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68   generator in th
16a80 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20  e SSL library,. 
16a90 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20      * using the 
16aa0 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75  do/while constru
16ab0 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ct because of th
16ac0 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68  e bug note in th
16ad0 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c  e.     * OpenSSL
16ae0 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77   FAQ at http://w
16af0 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73  ww.openssl.org/s
16b00 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23  upport/faq.html#
16b10 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20  USER1.     *.   
16b20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20    * The crux of 
16b30 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
16b40 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f  hat Solaris 7 do
16b50 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20  es not have a.  
16b60 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d     * /dev/random
16b70 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d   or /dev/urandom
16b80 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61   device so it ca
16b90 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75  nnot gather enou
16ba0 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70  gh.     * entrop
16bb0 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f  y from the RAND_
16bc0 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20  seed() when TLS 
16bd0 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20  initializes and 
16be0 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74  refuses.     * t
16bf0 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61  o go further. Ea
16c00 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
16c10 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65  f OpenSSL carrie
16c20 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e  d on regardless.
16c30 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61  .     */.    sra
16c40 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  nd((unsigned int
16c50 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a  ) time((time_t *
16c60 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f  ) NULL));.    do
16c70 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20   {..for (i = 0; 
16c80 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09  i < 16; i++) {..
16c90 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20      rnd_seed[i] 
16ca0 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35  = 1 + (char) (25
16cb0 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41  5.0 * rand()/(RA
16cc0 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d  ND_MAX+1.0));..}
16cd0 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f  ..RAND_seed(rnd_
16ce0 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64  seed, sizeof(rnd
16cf0 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77  _seed));.    } w
16d00 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75  hile (RAND_statu
16d10 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69  s() != 1);.#endi
16d20 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  f..#if defined(O
16d30 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16d40 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16d50 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
16d60 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d  exUnlock(&init_m
16d70 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  x);.#endif..    
16d80 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d  return status;.}
16d90 0a                                               .