Hex Artifact Content

Artifact cd25c543058588f506cbcab6615a15232b0117fc82c1f36effa50b6143f0c402:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e 63  nssl/rsa.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61  lude <openssl/sa
03c0: 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d  festack.h>../* M
03d0: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69  in OpenSSL versi
03e0: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  on */.#if OPENSS
03f0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
0400: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23   < 0x10101000L.#
0410: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e  error "Only Open
0420: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61  SSL v1.1.1 or la
0430: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  ter is supported
0440: 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 2a  ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69  tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29  ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e   \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 20  ULL) ? (char *) 
04a0: 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54  NULL : \...Tcl_T
04b0: 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
04c0: 28 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20  (interp, (key), 
04d0: 28 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20  (dsp)))..static 
04e0: 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69  SSL_CTX *CTX_Ini
04f0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
0500: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
0510: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
0520: 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63   *key,...char *c
0530: 65 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65  ertfile, unsigne
0540: 64 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31  d char *key_asn1
0550: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
0560: 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e  *cert_asn1,...in
0570: 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20  t key_asn1_len, 
0580: 69 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65  int cert_asn1_le
0590: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
05a0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09   char *CAfile,..
05b0: 09 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20  .char *ciphers, 
05c0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
05d0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
05e0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a  har *DHparams);.
05f0: 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c  .static int.TlsL
0600: 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69  ibInit(int unini
0610: 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69  tialize);..#defi
0620: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  ne TLS_PROTO_SSL
0630: 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20  2..0x01.#define 
0640: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09  TLS_PROTO_SSL3..
0650: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x02.#define TLS
0660: 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30  _PROTO_TLS1..0x0
0670: 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  4.#define TLS_PR
0680: 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a  OTO_TLS1_1.0x08.
0690: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
06a0: 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64  O_TLS1_2.0x10.#d
06b0: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
06c0: 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66  TLS1_3.0x20.#def
06d0: 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67  ine ENABLED(flag
06e0: 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29  , mask).(((flag)
06f0: 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d   & (mask)) == (m
0700: 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53  ask))..#define S
0710: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53  SLKEYLOGFILE.."S
0720: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f  SLKEYLOGFILE"../
0730: 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 65  *. * Thread-Safe
0740: 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23   TLS Code. */..#
0750: 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44  ifdef TCL_THREAD
0760: 53 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 53  S.#define OPENSS
0770: 4c 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 53  L_THREAD_DEFINES
0780: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
0790: 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e 68  sl/opensslconf.h
07a0: 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  >..#ifdef OPENSS
07b0: 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75  L_THREADS.#inclu
07c0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70  de <openssl/cryp
07d0: 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  to.h>.#include <
07e0: 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a  openssl/ssl.h>..
07f0: 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f  /*. * Threaded o
0800: 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  peration require
0810: 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61  s locking callba
0820: 63 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f  cks. * Based fro
0830: 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c  m /crypto/cryptl
0840: 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20  ib.c of OpenSSL 
0850: 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20  and NSOpenSSL.. 
0860: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d  */..static Tcl_M
0870: 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55  utex *locks = NU
0880: 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  LL;.static int l
0890: 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73  ocksCount = 0;.s
08a0: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20  tatic Tcl_Mutex 
08b0: 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 20  init_mx;.#endif 
08c0: 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  /* OPENSSL_THREA
08d0: 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  DS */.#endif /* 
08e0: 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a  TCL_THREADS */..
08f0: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
0900: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c  *******/./* Call
0910: 62 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a  backs        */.
0920: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0930: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c  . *. * Eval Call
0990: 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a  back Command --.
09a0: 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62   *. *.Eval callb
09b0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20  ack command and 
09c0: 63 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73  catch any errors
09d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
09e0: 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72   *.0 = Command r
09f0: 65 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20  eturned fail or 
0a00: 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43  eval returned TC
0a10: 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43  L_ERROR. *.1 = C
0a20: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20  ommand returned 
0a30: 73 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20  success or eval 
0a40: 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a  returned TCL_OK.
0a50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0a60: 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73  ts:. *.Evaluates
0a70: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
0a80: 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  d. *. *---------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
0ad0: 74 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61  tatic int.EvalCa
0ae0: 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72  llback(Tcl_Inter
0af0: 70 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65  p *interp, State
0b00: 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f   *statePtr, Tcl_
0b10: 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20  Obj *cmdPtr) {. 
0b20: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20     int code, ok 
0b30: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
0b40: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
0b50: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0b60: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0b70: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
0b80: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0b90: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
0ba0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
0bb0: 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 73  ack with success
0bc0: 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 72   for ok or retur
0bd0: 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c 20  n value 1, fail 
0be0: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 74  for error or ret
0bf0: 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a 20  urn value 0 */. 
0c00: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0c10: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0c20: 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  code = Tcl_EvalO
0c30: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
0c40: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
0c50: 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70 72 69 6e  OBAL);.    dprin
0c60: 74 66 28 22 45 76 61 6c 43 61 6c 6c 62 61 63 6b  tf("EvalCallback
0c70: 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b 0a 20 20  : %d", code);.  
0c80: 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43    if (code == TC
0c90: 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43 68 65 63  L_OK) {../* Chec
0ca0: 6b 20 72 65 73 75 6c 74 20 66 6f 72 20 72 65 74  k result for ret
0cb0: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 54 63  urn value */..Tc
0cc0: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 20 3d 20  l_Obj *result = 
0cd0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
0ce0: 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28 72  (interp);..if (r
0cf0: 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  esult == NULL ||
0d00: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
0d10: 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  bj(interp, resul
0d20: 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43 4c 5f 4f  t, &ok) != TCL_O
0d30: 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20 3d 20 31  K) {..    ok = 1
0d40: 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 52  ;..}..dprintf("R
0d50: 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f 6b 29 3b  esult: %d", ok);
0d60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f  .    } else {../
0d70: 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74  * Error - reject
0d80: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
0d90: 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 54 63   */..dprintf("Tc
0da0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
0db0: 72 22 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  r");.#if (TCL_MA
0dc0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
0dd0: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
0de0: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
0df0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
0e00: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
0e10: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e20: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
0e30: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
0e40: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52      }..    Tcl_R
0e50: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
0e60: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20  ta) statePtr);. 
0e70: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
0e80: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
0e90: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rp);.    return 
0ea0: 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ok;.}.../*. *---
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62  . *. * InfoCallb
0f00: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
0f10: 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63  itors SSL connec
0f20: 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a  tion process. *.
0f30: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
0f40: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
0f50: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
0f60: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
0f70: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d  fined). *. *----
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0fc0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a   */.static void.
0fd0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  InfoCallback(con
0fe0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
0ff0: 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29   where, int ret)
1000: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
1010: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
1020: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
1030: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20  a((SSL *)ssl);. 
1040: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
1050: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
1060: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
1070: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
1080: 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f 72 2c 20     char *major, 
1090: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72  *minor;..    dpr
10a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
10b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
10c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
10d0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
10e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20  return;..    if 
10f0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1100: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29  HANDSHAKE_START)
1110: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1120: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
1130: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d  = "start";.    }
1140: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20   else if (where 
1150: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1160: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f  KE_DONE) {..majo
1170: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
1180: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22  ..minor = "done"
1190: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
11a0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
11b0: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72  CB_ALERT)..major
11c0: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73   = "alert";..els
11d0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
11e0: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61  L_ST_CONNECT).ma
11f0: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b  jor = "connect";
1200: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1210: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54   & SSL_ST_ACCEPT
1220: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65  )..major = "acce
1230: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  pt";..else.....m
1240: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  ajor = "unknown"
1250: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20  ;...if (where & 
1260: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69  SSL_CB_READ)..mi
1270: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65  nor = "read";..e
1280: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1290: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d  SSL_CB_WRITE)..m
12a0: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a  inor = "write";.
12b0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12c0: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09  & SSL_CB_LOOP)..
12d0: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a  minor = "loop";.
12e0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12f0: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09  & SSL_CB_EXIT)..
1300: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a  minor = "exit";.
1310: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20  .else.....minor 
1320: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20  = "unknown";.   
1330: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
1340: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
1350: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
1360: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d   major, minor, m
1370: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65  essage, and type
1380: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
1390: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
13a0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
13b0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
13c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13e0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
13f0: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22  StringObj("info"
1400: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1420: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1430: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1440: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
1450: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
1460: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
1470: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1480: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1490: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14b0: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a  bj(major, -1));.
14c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
14d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
14f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69  _NewStringObj(mi
1500: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  nor, -1));..    
1510: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1520: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c  CB_ALERT) {..Tcl
1530: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1540: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1550: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1560: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1570: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e  alert_desc_strin
1580: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29  g_long(ret), -1)
1590: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
15a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
15b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
15c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
15d0: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70  bj(SSL_alert_typ
15e0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65  e_string_long(re
15f0: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20  t), -1));.    } 
1600: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  else {..Tcl_List
1610: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1620: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1630: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1640: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65  ingObj(SSL_state
1650: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
1660: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
1670: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1680: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1690: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
16a0: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29  Obj("info", -1))
16b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16c0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
16d0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
16e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
16f0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
1700: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
1710: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
1720: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1730: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
1740: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1790: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  . * MessageCallb
17a0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
17b0: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63  itors SSL protoc
17c0: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20  ol messages. *. 
17d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
17e0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
17f0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
1800: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
1810: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1860: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
1870: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
1880: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73  static void.Mess
1890: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20  ageCallback(int 
18a0: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72  write_p, int ver
18b0: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e  sion, int conten
18c0: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f  t_type, const vo
18d0: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  id *buf, size_t 
18e0: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76  len, SSL *ssl, v
18f0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
1900: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
1910: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
1920: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
1930: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
1940: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
1950: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
1960: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74     char *ver, *t
1970: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69  ype;.    BIO *bi
1980: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  o;.    char buff
1990: 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62  er[15000];.    b
19a0: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20  uffer[0] = 0;.. 
19b0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
19c0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
19d0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
19e0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
19f0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
1a00: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f     switch(versio
1a10: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  n) {.#if OPENSSL
1a20: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
1a30: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
1a40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
1a50: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
1a60: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
1a70: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45      case SSL2_VE
1a80: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53  RSION:..ver = "S
1a90: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  SLv2";..break;.#
1aa0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
1ab0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
1ac0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1ad0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73  NO_SSL3).    cas
1ae0: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL3_VERSION:.
1af0: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a  .ver = "SSLv3";.
1b00: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
1b10: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52     case TLS1_VER
1b20: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1b30: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  Sv1";..break;.  
1b40: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45    case TLS1_1_VE
1b50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b60: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.1";..break;
1b70: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32  .    case TLS1_2
1b80: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1b90: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65   "TLSv1.2";..bre
1ba0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1bb0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_3_VERSION:..ve
1bc0: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09  r = "TLSv1.3";..
1bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1be0: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22  0:..ver = "none"
1bf0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;..break;.    de
1c00: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75  fault:..ver = "u
1c10: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b  nknown";..break;
1c20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
1c30: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65  ch (content_type
1c40: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ) {.    case SSL
1c50: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79  3_RT_HEADER:..ty
1c60: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09  pe = "Header";..
1c70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c80: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f  SSL3_RT_INNER_CO
1c90: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70  NTENT_TYPE:..typ
1ca0: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65  e = "Inner Conte
1cb0: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b  nt Type";..break
1cc0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1cd0: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52  RT_CHANGE_CIPHER
1ce0: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22  _SPEC:..type = "
1cf0: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a  Change Cipher";.
1d00: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d10: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a   SSL3_RT_ALERT:.
1d20: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b  .type = "Alert";
1d30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1d40: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d50: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d60: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b  ndshake";..break
1d70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1d80: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44  RT_APPLICATION_D
1d90: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70  ATA:..type = "Ap
1da0: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b  p Data";..break;
1db0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
1dc0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
1dd0: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61  30000000L.    ca
1de0: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52  se DTLS1_RT_HEAR
1df0: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22  TBEAT:..type = "
1e00: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65  Heartbeat";..bre
1e10: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
1e20: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20  efault:..type = 
1e30: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d  "unknown";.    }
1e40: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63  ..    /* Needs c
1e50: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69  ompile time opti
1e60: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74  on "enable-ssl-t
1e70: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66  race". */.    if
1e80: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77   ((bio = BIO_new
1e90: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21  (BIO_s_mem())) !
1ea0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e  = NULL) {..int n
1eb0: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69  ;..SSL_trace(wri
1ec0: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63  te_p, version, c
1ed0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66  ontent_type, buf
1ee0: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69  , len, ssl, (voi
1ef0: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42  d *)bio);..n = B
1f00: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
1f10: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67  fer, BIO_pending
1f20: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20  (bio) < 15000 ? 
1f30: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1f40: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20   : 14999);..n = 
1f50: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09  (n<0) ? 0 : n;..
1f60: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09  buffer[n] = 0;..
1f70: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28  (void)BIO_flush(
1f80: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  bio);..BIO_free(
1f90: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20  bio);.   }..    
1fa0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
1fb0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
1fc0: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69  n, chan, directi
1fd0: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70  on, version, typ
1fe0: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61  e, and message a
1ff0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
2000: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2010: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
2020: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
2030: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2040: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2050: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2060: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65  ringObj("message
2070: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2080: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2090: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
20a0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
20b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
20c0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
20d0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
20e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2100: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2110: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2120: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53  Obj(write_p ? "S
2130: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64  ent" : "Received
2140: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2150: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2160: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2170: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2180: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29  ingObj(ver, -1))
2190: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
21a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
21b0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
21c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
21d0: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  type, -1));.    
21e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
21f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2200: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2210: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
2220: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
2230: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2250: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2260: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
2270: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
2280: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
2290: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
22a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
22b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
22c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66  ----. *. * Verif
2310: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  yCallback --. *.
2320: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
2330: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69  certificate vali
2340: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20  dation process. 
2350: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  Used to control 
2360: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20  the. *.behavior 
2370: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52  when the SSL_VER
2380: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73  IFY_PEER flag is
2390: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61   set. This is ca
23a0: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72  lled. *.whenever
23b0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69   a certificate i
23c0: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64  s inspected or d
23d0: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20  ecided invalid. 
23e0: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61  Called for. *.ea
23f0: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69  ch certificate i
2400: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e  n the cert chain
2410: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a  .. *. * Checks:.
2420: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61   *.The certifica
2430: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63  te chain is chec
2440: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  ked starting wit
2450: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65  h the deepest ne
2460: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20  sting level. *. 
2470: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65   (the root CA ce
2480: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77  rtificate) and w
2490: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20  orked upward to 
24a0: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69  the peer's certi
24b0: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73  ficate.. *.All s
24c0: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61  ignatures are va
24d0: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d  lid, current tim
24e0: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73  e is within firs
24f0: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64  t and last valid
2500: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65  ity time.. *.Che
2510: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74  ck that the cert
2520: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65  ificate is issue
2530: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20  d by the issuer 
2540: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75  certificate issu
2550: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  er.. *.Check the
2560: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74   revocation stat
2570: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74  us for each cert
2580: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63  ificate.. *.Chec
2590: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f  k the validity o
25a0: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20  f the given CRL 
25b0: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76  and the cert rev
25c0: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a  ocation status..
25d0: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c   *.Check the pol
25e0: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65  icies of all the
25f0: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a   certificates. *
2600: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76  . * Args. *.prev
2610: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74  erify_ok indicat
2620: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63  es whether the c
2630: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66  ertificate verif
2640: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28  ication passed (
2650: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a  1) or not (0). *
2660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
2670: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64  A callback bound
2680: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d   to the socket m
2690: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ay return one of
26a0: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74  :. *.    0...- t
26b0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
26c0: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64  s deemed invalid
26d0: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74  , send verificat
26e0: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c  ion. *....  fail
26f0: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65  ure alert to pee
2700: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65  r, and terminate
2710: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2720: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72     1...- the cer
2730: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
2740: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e  ed valid, contin
2750: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  ue with handshak
2760: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20  e.. *.    empty 
2770: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e  string.- no chan
2780: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74  ge to certificat
2790: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a  e validation. *.
27a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
27b0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
27c0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
27d0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
27e0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
27f0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
2800: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
2810: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
2820: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
2880: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
2890: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
28a0: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20  RE_CTX *ctx) {. 
28b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
28c0: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73  tr;.    SSL   *s
28d0: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39  sl..= (SSL*)X509
28e0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
28f0: 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f  x_data(ctx, SSL_
2900: 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39  get_ex_data_X509
2910: 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29  _STORE_CTX_idx()
2920: 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65  );.    X509  *ce
2930: 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  rt..= X509_STORE
2940: 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74  _CTX_get_current
2950: 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20  _cert(ctx);.    
2960: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09  State *statePtr.
2970: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
2980: 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b  t_app_data(ssl);
2990: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
29a0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
29b0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
29c0: 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30  int depth..= X50
29d0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
29e0: 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29  error_depth(ctx)
29f0: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d  ;.    int err..=
2a00: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
2a10: 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a  get_error(ctx);.
2a20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
2a30: 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69  lled");.    dpri
2a40: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62  ntf("VerifyCallb
2a50: 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  ack: %d", ok);..
2a60: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2a70: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
2a80: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20  bj*)NULL) {../* 
2a90: 55 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20  Use ok value if 
2aa0: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20  verification is 
2ab0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20  required */..if 
2ac0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67  (statePtr->vflag
2ad0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46  s & SSL_VERIFY_F
2ae0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
2af0: 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ERT) {..    retu
2b00: 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b  rn ok;..} else {
2b10: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ..    return 1;.
2b20: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
2b30: 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c   (cert == NULL |
2b40: 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | ssl == NULL) {
2b50: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
2b60: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
2b70: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2b80: 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b  eval callback");
2b90: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2ba0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
2bb0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64  with fn, chan, d
2bc0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20  epth, cert info 
2bd0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e  list, status, an
2be0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a  d error args */.
2bf0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2c00: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2c10: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
2c20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2c30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2c50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
2c60: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rify", -1));.   
2c70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c90: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2ca0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2cb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
2cc0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2cd0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2ce0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2cf0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2d00: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2d10: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63  (depth));.    Tc
2d20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2d30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2d40: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35  mdPtr, Tls_NewX5
2d50: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65  09Obj(interp, ce
2d60: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  rt));.    Tcl_Li
2d70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d80: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2d90: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2da0: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  (ok));.    Tcl_L
2db0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2dc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2dd0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
2de0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30  ngObj((char*)X50
2df0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
2e00: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
2e10: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50   -1));..    /* P
2e20: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65  revent I/O while
2e30: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20   callback is in 
2e40: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20  progress */.    
2e50: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2e60: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41  gs |= TLS_TCL_CA
2e70: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20  LLBACK; */..    
2e80: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
2e90: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
2ea0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2eb0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b  (cmdPtr);.    ok
2ec0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
2ed0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
2ee0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
2ef0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2f00: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70  cmdPtr);..    dp
2f10: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c  rintf("VerifyCal
2f20: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72  lback: command r
2f30: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29  esult = %d", ok)
2f40: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  ;..    /* stateP
2f50: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54  tr->flags &= ~(T
2f60: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
2f70: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
2f80: 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c  ok;./* By defaul
2f90: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63  t, leave verific
2fa0: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
2fb0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   */.}.../*. *---
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72  . *. * Tls_Error
3010: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20   --. *. *.Calls 
3020: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72  callback with er
3030: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
3040: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3050: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
3060: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
3070: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
3080: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
3090: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
30a0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
30b0: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
30c0: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45  -. */.void.Tls_E
3120: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74  rror(State *stat
3130: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29  ePtr, char *msg)
3140: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
3150: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
3160: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
3170: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
3180: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
3190: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65   unsigned long e
31a0: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rr;.    statePtr
31b0: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20  ->err = msg;..  
31c0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
31d0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
31e0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
31f0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
3200: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
3210: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3220: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
3230: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
3240: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
3250: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3260: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3270: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
3280: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3290: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
32a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
32b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
32c0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
32d0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
32e0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
32f0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3300: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3310: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
3320: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
3330: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
3340: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
3350: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3360: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3370: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3380: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3390: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
33a0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
33b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
33c0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
33d0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
33e0: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
33f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3400: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3410: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
3420: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
3430: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
3440: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3450: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
3460: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3470: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
3480: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
3490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
34a0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
34b0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
34c0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
34d0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
34e0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
34f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3500: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3510: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
3520: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
3530: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
3540: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
3550: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3560: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
3570: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
3580: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
3590: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
35a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
35b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3600: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20   KeyLogCallback 
3610: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72  --. *. *.Write r
3620: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61  eceived key data
3630: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a   to log file.. *
3640: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3650: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c  --. */.void KeyL
36b0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  ogCallback(const
36c0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
36d0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20   char *line) {. 
36e0: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67     char *str = g
36f0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
3700: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a  ILE);.    FILE *
3710: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  fd;..    dprintf
3720: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3730: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20   if (str) {..fd 
3740: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22  = fopen(str, "a"
3750: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20  );..fprintf(fd, 
3760: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66  "%s\n",line);..f
3770: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
3780: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
37d0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c  . * Password Cal
37e0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43  lback --. *. *.C
37f0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73  alled when a pas
3800: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20  sword is needed 
3810: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3820: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20  y when loading. 
3830: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50  *.or storing a P
3840: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77  EM certificate w
3850: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20  ith encryption. 
3860: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20  Evals callback. 
3870: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74  *.script and ret
3880: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  urns the result 
3890: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20  as the password 
38a0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20  string in buf.. 
38b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
38c0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
38d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
38e0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
38f0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
3900: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77  eturns:. *.Passw
3910: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ord size in byte
3920: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65  s or -1 for an e
3930: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61  */.static int.Pa
3990: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63  sswordCallback(c
39a0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69  har *buf, int si
39b0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20  ze, int rwflag, 
39c0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20  void *udata) {. 
39d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
39e0: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75  tr.= (State *) u
39f0: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  data;.    Tcl_In
3a00: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3a10: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3a20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3a30: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
3a40: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  de;.    Tcl_Size
3a50: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e   len;..    dprin
3a60: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
3a70: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
3a80: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
3a90: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
3aa0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3ab0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
3ac0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
3ad0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3ae0: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3af0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3b00: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3b10: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3b20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3b30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3b40: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3b50: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3b60: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54      if (len > (T
3b70: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29  cl_Size) size-1)
3b80: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f   {...len = (Tcl_
3b90: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20  Size) size-1;.. 
3ba0: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70     }..    strncp
3bb0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3bc0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
3bd0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  buf[len] = '\0';
3be0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3bf0: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20  t) len;..} else 
3c00: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  {..    return -1
3c10: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
3c20: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3c30: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
3c40: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73  n, rwflag, and s
3c50: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ize args */.    
3c60: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
3c70: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
3c80: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20  tr->password);. 
3c90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3ca0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3cb0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3cc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61  NewStringObj("pa
3cd0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20  ssword", -1));. 
3ce0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3cf0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3d00: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3d10: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67  NewIntObj(rwflag
3d20: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3d30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3d40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d50: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
3d60: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ize));..    Tcl_
3d70: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
3d80: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
3d90: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
3da0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3db0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3dc0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
3dd0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
3de0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
3df0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
3e00: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
3e10: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3e20: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3e30: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
3e40: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
3e50: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
3e60: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
3e70: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
3e80: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
3e90: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
3ea0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
3eb0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
3ec0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
3ed0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3ee0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3ef0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
3f00: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3f10: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3f20: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  r);..    /* If s
3f30: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20  uccessful, pass 
3f40: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74  back password st
3f50: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74  ring and truncat
3f60: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f  e if too long */
3f70: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
3f80: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72   TCL_OK) {..char
3f90: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3fa0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
3fb0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
3fc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
3fd0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20  &len);..if (len 
3fe0: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  > (Tcl_Size) siz
3ff0: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20  e-1) {..    len 
4000: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  = (Tcl_Size) siz
4010: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
4020: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
4030: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
4040: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
4050: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
4060: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
4070: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
4080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
4090: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
40a0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
40b0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c    return -1;.}..
40c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4110: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b  Session Callback
4120: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
4130: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
4140: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
4150: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
4160: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e  cache. In TLS 1.
4170: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65  3. *.this may be
4180: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
4190: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74  le times after t
41a0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f  he handshake. Fo
41b0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72  r. *.earlier ver
41c0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c  sions, this will
41d0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72   be received dur
41e0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ing the handshak
41f0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68  e.. *.This is th
4200: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20  e preferred way 
4210: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75  to obtain a resu
4220: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20  mable session.. 
4230: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4240: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4250: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4260: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4270: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
4280: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
4290: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20  0 = error where 
42a0: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20  session will be 
42b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f  immediately remo
42c0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ved from the int
42d0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09  ernal cache.. *.
42e0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72  1 = success wher
42f0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65  e app retains se
4300: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e  ssion in session
4310: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74   cache, and must
4320: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f   call SSL_SESSIO
4330: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f  N_free() when do
4340: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4390: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73  .static int.Sess
43a0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20  ionCallback(SSL 
43b0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
43c0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
43d0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
43e0: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
43f0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
4400: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
4410: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4420: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4430: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4440: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
4450: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4460: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4470: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4480: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4490: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
44a0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
44b0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
44c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
44d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
44e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
44f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
4500: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4510: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
4520: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
4530: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4540: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4550: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4560: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4570: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
4580: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73  h fn, chan, sess
4590: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20  ion id, session 
45a0: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65  ticket, and life
45b0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  time args */.   
45c0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
45d0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
45e0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
45f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4600: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4610: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4620: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
4630: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20  ession", -1));. 
4640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4660: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
4670: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4680: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
4690: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
46a0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  elf), -1));..   
46b0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a   /* Session id *
46c0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64  /.    session_id
46d0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
46e0: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
46f0: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  ulen);.    Tcl_L
4700: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4710: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4720: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4730: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f  rrayObj(session_
4740: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
4750: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  len));..    /* S
4760: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f  ession ticket */
4770: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e  .    SSL_SESSION
4780: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
4790: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
47a0: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  len2);.    Tcl_L
47b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
47c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
47d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
47e0: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
47f0: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
4800: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74  );..    /* Lifet
4810: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20  ime - number of 
4820: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54  seconds */.    T
4830: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4840: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4850: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
4860: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53  LongObj((long) S
4870: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
4880: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
4890: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  int(session)));.
48a0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
48b0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
48c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
48d0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
48e0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
48f0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
4900: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
4910: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4920: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  cmdPtr);..    /*
4930: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f   Return 0 for no
4940: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20  w until session 
4950: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70  handling is comp
4960: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
4970: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61  --. *. * ALPN Ca
49d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
49e0: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62  rs and NPN Callb
49f0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
4a00: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
4a10: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f   protocol (http/
4a20: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63  1.1, h2, h3, etc
4a30: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72  .) selection for
4a40: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67   the. *.incoming
4a50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c   connection. Cal
4a60: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20  led after Hello 
4a70: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62  and server callb
4a80: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27  acks.. *.Where '
4a90: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64  out' is selected
4aa0: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69   protocol and 'i
4ab0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61  n' is the peer a
4ac0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a  dvertised list..
4ad0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4ae0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4af0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4b00: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4b10: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4b20: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4b30: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4b40: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  OK: ALPN protoco
4b50: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
4b60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4b70: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4b80: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
4b90: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e  TAL: There was n
4ba0: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  o overlap betwee
4bb0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20  n the client's. 
4bc0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c  *.    supplied l
4bd0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76  ist and the serv
4be0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
4bf0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4c00: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64   will be aborted
4c10: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
4c20: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20  ERR_NOACK: ALPN 
4c30: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
4c40: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63  ected, e.g., bec
4c50: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09  ause no ALPN. *.
4c60: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72      protocols ar
4c70: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  e configured for
4c80: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
4c90: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4ca0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
4cb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4d00: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  int.ALPNCallback
4d10: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74  (SSL *ssl, const
4d20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4d30: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  *out, unsigned c
4d40: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f  har *outlen,..co
4d50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4d60: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r *in, unsigned 
4d70: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20  int inlen, void 
4d80: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4d90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4da0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4db0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4dc0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4dd0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4de0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4df0: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20  nt code, res;.. 
4e00: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4e10: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4e20: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4e30: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4e40: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4e50: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4e60: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
4e70: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
4e80: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e  if (SSL_select_n
4e90: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67  ext_proto((unsig
4ea0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74  ned char **) out
4eb0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50  , outlen, stateP
4ec0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74  tr->protos, stat
4ed0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
4ee0: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d  ,..in, inlen) ==
4ef0: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47   OPENSSL_NPN_NEG
4f00: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d  OTIATED) {../* M
4f10: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72  atch found */..r
4f20: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4f30: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4f40: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c  se {../* OPENSSL
4f50: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20  _NPN_NO_OVERLAP 
4f60: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f  = No overlap, so
4f70: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20   use first item 
4f80: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74  from client prot
4f90: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65  ocol list */..re
4fa0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4fb0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4fc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4fd0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
4fe0: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4ff0: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a  turn res;.    }.
5000: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
5010: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
5020: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65  ith fn, chan, de
5030: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c  pth, cert info l
5040: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64  ist, status, and
5050: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20   error args */. 
5060: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5070: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5080: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5090: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
50a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
50b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
50c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
50d0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
50e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
50f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5100: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5110: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5120: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5130: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5140: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5150: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5160: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5170: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5180: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72  gObj((const char
5190: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a   *) *out, -1));.
51a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
51b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
51c0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
51d0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
51e0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54  es == SSL_TLSEXT
51f0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20  _ERR_OK));..    
5200: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
5210: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
5220: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5230: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
5240: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
5250: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
5260: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
5270: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
5280: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5290: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  OACK;.    } else
52a0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
52b0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
52c0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
52d0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
52e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
52f0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20  LERT_FATAL;.    
5300: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5310: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5320: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5330: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5380: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f   * Advertise Pro
5390: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20  tocols Callback 
53a0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f  for Next Protoco
53b0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e  l Negotiation (N
53c0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c  PN) in ServerHel
53d0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c  lo --. *. *.call
53e0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65  ed when a TLS se
53f0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73  rver needs a lis
5400: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70  t of supported p
5410: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78  rotocols for Nex
5420: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65  t. *.Protocol Ne
5430: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  gotiation.. *. *
5440: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5450: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5460: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75  ects:. *. * Retu
5470: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5480: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
5490: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  NPN protocol sel
54a0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
54b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
54c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
54d0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72  RR_NOACK: NPN pr
54e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
54f0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5500: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5510: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
5560: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69  ef USE_NPN.stati
5570: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63  c int.NPNCallbac
5580: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5590: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
55a0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
55b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65  igned int *outle
55c0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
55d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
55e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
55f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
5600: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5610: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5620: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5630: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5640: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5650: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
5660: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  t protocols list
5670: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
5680: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
5690: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20  NULL) {..*out = 
56a0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
56b0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61  ;..*outlen = sta
56c0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
56d0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
56e0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a  .*out = NULL;..*
56f0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74  outlen = 0;..ret
5700: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5710: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5720: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
5730: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
5740: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c  -. *. * SNI Call
57a0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
57b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
57c0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e  m server-side SN
57d0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63  I hostname selec
57e0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69  tion after recei
57f0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69  ving SNI extensi
5800: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20  on. *.in Client 
5810: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66  Hello. Called af
5820: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61  ter hello callba
5830: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c  ck but before AL
5840: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  PN callback.. *.
5850: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5860: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5870: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
5880: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
5890: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
58a0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
58b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
58c0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
58d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
58e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
58f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
5900: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5910: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  AL: SNI hostname
5920: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5930: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5940: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74  . *.    is abort
5950: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20  ed. Default for 
5960: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f  alert is SSL_AD_
5970: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5980: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  E.. *.SSL_TLSEXT
5990: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
59a0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  NG: SNI hostname
59b0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
59c0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a  , warning alert.
59d0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74   *.    sent (not
59e0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c   supported in TL
59f0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e  Sv1.3). The conn
5a00: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5a10: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5a20: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68  ERR_NOACK: SNI h
5a30: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5a40: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20  ccepted and not 
5a50: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a  acknowledged,. *
5a60: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49  .    e.g. if SNI
5a70: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
5a80: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f  nfigured. The co
5a90: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5aa0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5af0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43  .static int.SNIC
5b00: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5b10: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
5b20: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
5b30: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5b40: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5b50: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
5b60: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
5b70: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
5b80: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
5b90: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
5ba0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
5bb0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
5bc0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64  e = NULL;..    d
5bd0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
5be0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5bf0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5c00: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5c10: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5c20: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5c30: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20    /* Only works 
5c40: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20  for TLS 1.2 and 
5c50: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73  earlier */.    s
5c60: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f  ervername = SSL_
5c70: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
5c80: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
5c90: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a  YPE_host_name);.
5ca0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e      if (!servern
5cb0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d  ame || servernam
5cc0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  e[0] == '\0') {.
5cd0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5ce0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5cf0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
5d00: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
5d10: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
5d20: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5d30: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5d40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
5d50: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
5d60: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
5d70: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  and server name 
5d80: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
5d90: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
5da0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
5db0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
5dc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5dd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5de0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5df0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
5e00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5e10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5e20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
5e30: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
5e40: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
5e50: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5e60: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5e70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5e80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5e90: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5ea0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
5eb0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
5ec0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5ed0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5ee0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5ef0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5f00: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5f10: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5f20: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5f30: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5f40: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5f50: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5f60: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  G;..*alert = SSL
5f70: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5f80: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5f90: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5fa0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  .3 */.    } else
5fb0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
5fc0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5fd0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5fe0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5ff0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
6000: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c  LERT_FATAL;..*al
6010: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
6020: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
6030: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
6040: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
6050: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6060: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6070: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6080: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
60d0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c   *. * ClientHell
60e0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c  o Handshake Call
60f0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
6100: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62   --. *. *.Used b
6110: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d  y server to exam
6120: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e  ine the server n
6130: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
6140: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20  SNI) extension. 
6150: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  *.provided by th
6160: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65  e client in orde
6170: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61  r to select an a
6180: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69  ppropriate certi
6190: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65  ficate to. *.pre
61a0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f  sent, and make o
61b0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
61c0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72  on adjustments r
61d0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20  elevant to that 
61e0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61  server. *.name a
61f0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61  nd its configura
6200: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75  tion. This inclu
6210: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74  des swapping out
6220: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
6230: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74   *.SSL_CTX point
6240: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  er, modifying th
6250: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20  e server's list 
6260: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53  of permitted TLS
6270: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68   versions,. *.ch
6280: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65  anging the serve
6290: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20  r's cipher list 
62a0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  in response to t
62b0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68  he client's ciph
62c0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a  er list, etc.. *
62d0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53  .Called before S
62e0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c  NI and ALPN call
62f0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  backs.. *. * Res
6300: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
6310: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6320: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
6330: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
6340: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
6350: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  des:. *.SSL_CLIE
6360: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20  NT_HELLO_RETRY: 
6370: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
6380: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
6390: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
63a0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
63b0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
63c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
63d0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65  ROR: failure, te
63e0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69  rminate connecti
63f0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f  on. Set alert to
6400: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09   error code.. *.
6410: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6420: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73  _SUCCESS: succes
6430: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
6480: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43  tatic int.HelloC
6490: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
64a0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
64b0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
64c0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
64d0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
64e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
64f0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
6500: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
6510: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
6520: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
6530: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6540: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20  *servername;.   
6550: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6560: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a  char *p;.    siz
6570: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69  e_t len, remaini
6580: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ng;..    dprintf
6590: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
65a0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
65b0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
65c0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
65d0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
65e0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
65f0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
6600: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55   (const SSL *)NU
6610: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f  LL || arg == (vo
6620: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  id *)NULL) {..re
6630: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6640: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6650: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e   }..    /* Get n
6660: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  ames */.    if (
6670: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  !SSL_client_hell
6680: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20  o_get0_ext(ssl, 
6690: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76  TLSEXT_TYPE_serv
66a0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65  er_name, &p, &re
66b0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61  maining) || rema
66c0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
66d0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53  alert = SSL_R_SS
66e0: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41  LV3_ALERT_ILLEGA
66f0: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65  L_PARAMETER;..re
6700: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6710: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6720: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
6730: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ct the length of
6740: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69   the supplied li
6750: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a  st of names. */.
6760: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
6770: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
6780: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
6790: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72  if (len + 2 != r
67a0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
67b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
67c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
67d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
67e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
67f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6800: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d  .    remaining =
6810: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   len;..    /* Th
6820: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69  e list in practi
6830: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69  ce only has a si
6840: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f  ngle element, so
6850: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65   we only conside
6860: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  r the first one.
6870: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6880: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70  ining == 0 || *p
6890: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d  ++ != TLSEXT_NAM
68a0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
68b0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
68c0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
68d0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
68e0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
68f0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6900: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6910: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  ng--;..    /* No
6920: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79  w we can finally
6930: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79   pull out the by
6940: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68  te array with th
6950: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d  e actual hostnam
6960: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
6970: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
6980: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6990: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
69a0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
69b0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
69c0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
69d0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70  }.    len = (*(p
69e0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c  ++) << 8);.    l
69f0: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20  en += *(p++);.  
6a00: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20    if (len + 2 > 
6a10: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
6a20: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6a30: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6a40: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
6a50: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6a60: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
6a70: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
6a80: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61  en;.    serverna
6a90: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
6aa0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72   *)p;..    /* Cr
6ab0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
6ac0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
6ad0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e  an, and server n
6ae0: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ame args */.    
6af0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
6b00: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
6b10: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54  tr->vcmd);.    T
6b20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6b30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6b40: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6b50: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22  tringObj("hello"
6b60: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
6b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6b80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6b90: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
6ba0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
6bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
6bc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
6bd0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
6be0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6bf0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6c00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6c10: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28  bj(servername, (
6c20: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b  Tcl_Size) len));
6c30: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
6c40: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
6c50: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
6c60: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6c70: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
6c80: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
6c90: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
6ca0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
6cb0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6cc0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a  _HELLO_RETRY;..*
6cd0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6ce0: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43  SV1_ALERT_USER_C
6cf0: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20  ANCELLED;.    } 
6d00: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d  else if (code ==
6d10: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6d20: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6d30: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
6d40: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  e {..res = SSL_C
6d50: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6d60: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  R;..*alert = SSL
6d70: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6d80: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20  NTERNAL_ERROR;. 
6d90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6da0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6db0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6dc0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  s;.}.../********
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
6de0: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20   Commands       
6df0: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
6e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
6e10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68  -----. *. * Ciph
6e60: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  ersObjCmd -- lis
6e70: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
6e80: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ers. *. *.This p
6e90: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
6ea0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
6eb0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  he "tls::ciphers
6ec0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
6ed0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
6ee0: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70  iphers, based up
6ef0: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  on protocol sele
6f00: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cted.. *. * Resu
6f10: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6f20: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
6f30: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
6f40: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
6f50: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f  ructs and destro
6f60: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ys SSL context (
6f70: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6fc0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6fd0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d  har *protocols[]
6fe0: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73   = {.."ssl2", "s
6ff0: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74  sl3", "tls1", "t
7000: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22  ls1.1", "tls1.2"
7010: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c  , "tls1.3", NULL
7020: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  .};.enum protoco
7030: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32  l {.    TLS_SSL2
7040: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
7050: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
7060: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
7070: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f  S_TLS1_3, TLS_NO
7080: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  NE.};..static in
7090: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t.CiphersObjCmd(
70a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
70b0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
70c0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
70d0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
70e0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
70f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7100: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
7110: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
7120: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
7130: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
7140: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
7150: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62   *sk;.    char b
7160: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
7170: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
7180: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
7190: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
71a0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
71b0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f  *method;.    (vo
71c0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
71d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
71e0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
71f0: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
7200: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
7210: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7220: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7230: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
7240: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
7250: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7260: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7270: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
7280: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7290: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
72a0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
72b0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
72c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
72e0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
72f0: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
7300: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7310: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
7320: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
7330: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7340: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7350: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
7360: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
7370: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
7380: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
7390: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
73a0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
73b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
73c0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
73d0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
73e0: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
73f0: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
7400: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
7410: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7420: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
7430: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
7440: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
7450: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7460: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
7470: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7480: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
7490: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
74a0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
74b0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
74c0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
74d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
74e0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53  ..    method = S
74f0: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62  SLv2_method(); b
7500: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7510: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
7520: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
7530: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7540: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
7550: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7560: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7570: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
7590: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
75a0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
75b0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
75c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
75d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
75e0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
75f0: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
7600: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
7610: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
7620: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
7630: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
7640: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7650: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7660: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7670: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
7680: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7690: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
76a0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
76b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
76c0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
76d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
76e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
76f0: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7700: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b   TLSv1_method();
7710: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
7720: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a  case TLS_TLS1_1:
7730: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7740: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7750: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7760: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
7770: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7780: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _1_METHOD)..    
7790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
77a0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
77b0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
77c0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
77d0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
77e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
77f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7800: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7810: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64  = TLSv1_1_method
7820: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7830: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7840: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _2:.#if defined(
7850: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7860: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7870: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
7880: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7890: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_2_METHOD).. 
78a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
78b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
78c0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
78d0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
78e0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
78f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
7900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7910: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7920: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74  od = TLSv1_2_met
7930: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7940: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7950: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_3:.#if defin
7960: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
7970: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7980: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20  _NO_TLS1_3)..   
7990: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
79a0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
79b0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
79c0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
79d0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
79e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
79f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7a00: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7a10: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
7a20: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
7a30: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
7a40: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
7a50: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53  VERSION);..    S
7a60: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
7a70: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
7a80: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
7a90: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  );..    break;.#
7aa0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a  endif..default:.
7ab0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
7ac0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20  S_method();..   
7ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7ae0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7af0: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
7b00: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c    if (ctx == NUL
7b10: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7b20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
7b30: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
7b40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7b50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7b60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
7b70: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78  sl = SSL_new(ctx
7b80: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  );.    if (ssl =
7b90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7ba0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7bb0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53  rp, GET_ERR_REAS
7bc0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
7bd0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
7be0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
7bf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7c00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c   }..    /* Use l
7c10: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73  ist and order as
7c20: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69   would be sent i
7c30: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  n a ClientHello 
7c40: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  or all available
7c50: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20   ciphers */.    
7c60: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7c70: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  d) {..sk = SSL_g
7c80: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69  et1_supported_ci
7c90: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7ca0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53  } else {..sk = S
7cb0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73  SL_get_ciphers(s
7cc0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
7cd0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20  if (sk != NULL) 
7ce0: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29  {..if (!verbose)
7cf0: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68   {..    const ch
7d00: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a  ar *cp;..    obj
7d10: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7d20: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7d30: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7d40: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7d50: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7d60: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7d70: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7d80: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7d90: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
7da0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
7db0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
7dc0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
7dd0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
7de0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
7df0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7e00: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7e10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7e20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7e30: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7e40: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
7e50: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20   cp, -1));..    
7e60: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
7e70: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7e80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
7e90: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
7ea0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
7eb0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
7ec0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
7ed0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
7ee0: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
7ef0: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
7f00: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
7f10: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
7f20: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
7f30: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
7f40: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
7f50: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
7f60: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
7f70: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
7f80: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7f90: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
7fa0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  uf, (Tcl_Size) s
7fb0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d  trlen(buf));...}
7fc0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63   else {...    Tc
7fd0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7fe0: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e  jPtr, "UNKNOWN\n
7ff0: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 8);...}..    
8000: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75  }..}..if (use_su
8010: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
8020: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
8030: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  ee(sk);..}.    }
8040: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
8050: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
8060: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20  free(ctx);..    
8070: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8080: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
8090: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
80a0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
80b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
8100: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
8110: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8120: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
8130: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8140: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8150: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
8160: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
8170: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
8180: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
8190: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
81a0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
81b0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
81c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
81d0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8220: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
8230: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
8240: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8250: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8260: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8270: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
8280: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8290: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
82a0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
82b0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
82c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
82d0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
82e0: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
82f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8300: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72  1, objv, "");..r
8310: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8330: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8340: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
8350: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
8360: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ULL);..#if OPENS
8370: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
8380: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
8390: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
83a0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
83b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
83c0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
83d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
83e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
83f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8400: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
8410: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L2], -1));.#endi
8420: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8430: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8440: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
8450: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
8460: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
8470: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
8480: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8490: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
84a0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
84b0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
84c0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29  [TLS_SSL3], -1))
84d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
84e0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
84f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8500: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
8510: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8520: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
8530: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8540: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8550: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8560: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8570: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8580: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8590: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
85a0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
85b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
85c0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
85d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
85e0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
85f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8600: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8610: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8620: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8630: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
8640: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8660: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
8670: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8680: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
8690: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
86a0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
86b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
86c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
86d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
86e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
86f0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c  ols[TLS_TLS1_2],
8700: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8710: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8720: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
8730: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8740: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_3).    Tcl_Lis
8750: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8760: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8770: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8780: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8790: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_3], -1));.
87a0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
87b0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
87c0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
87d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
87e0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8830: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
8840: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8850: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
8860: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
8870: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
8880: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
8890: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
88a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
88b0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
88c0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
88d0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
88e0: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
88f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8900: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
8910: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
8920: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
8930: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
8980: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65  ic int Handshake
8990: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
89a0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
89b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
89c0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
89d0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
89e0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
89f0: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
8a00: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
8a10: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
8a20: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
8a30: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
8a40: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
8a50: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
8a60: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
8a70: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
8a80: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
8a90: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
8aa0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
8ab0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
8ac0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
8ad0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
8ae0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
8af0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8b00: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8b10: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
8b20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8b30: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
8b40: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
8b50: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
8b60: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
8b70: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8b80: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
8b90: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
8ba0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8bb0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8bc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8bd0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
8be0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8bf0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
8c00: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
8c10: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
8c20: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
8c30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8c40: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
8c50: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
8c60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8c70: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8c80: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8c90: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8ca0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
8cb0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
8cc0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
8cd0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8ce0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8cf0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8d00: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
8d10: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
8d20: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
8d30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8d40: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
8d50: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
8d60: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
8d70: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64  ta(chan);..    d
8d80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
8d90: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8da0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ct");.    ret = 
8db0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8dc0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
8dd0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e  r, 1);.    dprin
8de0: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
8df0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a  onnect returned:
8e00: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20   %i", ret);..   
8e10: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20   if (ret < 0 && 
8e20: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ((statePtr->flag
8e30: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
8e40: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41  C) && (err == EA
8e50: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e  GAIN))) {..dprin
8e60: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e  tf("Async set an
8e70: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29  d err = EAGAIN")
8e80: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  ;..ret = 0;.    
8e90: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c  } else if (ret <
8ea0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75   0) {..long resu
8eb0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  lt;..errStr = st
8ec0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
8ed0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8ee0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
8ef0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
8f00: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
8f10: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
8f20: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
8f30: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
8f40: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
8f50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8f60: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
8f70: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
8f80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8f90: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53  .if ((result = S
8fa0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
8fb0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
8fc0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f  sl)) != X509_V_O
8fd0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  K) {..    Tcl_Ap
8fe0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8ff0: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c  p, " due to \"",
9000: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
9010: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
9020: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63  esult), "\"", (c
9030: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d  har *) NULL);..}
9040: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
9050: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
9060: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
9070: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
9080: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
9090: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
90a0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
90b0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
90c0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
90d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
90f0: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
9100: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
9110: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
9120: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
9130: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
9140: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
9150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
9160: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
9170: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
9180: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
9190: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
91a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
91b0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
91c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
91d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
9230: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
9240: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
9250: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
9260: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
9270: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
9280: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
9290: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
92a0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
92b0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
92c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
92d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
92e0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
92f0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
9300: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
9310: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
9320: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9370: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
9380: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
9390: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
93a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
93b0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
93c0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
93d0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
93e0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
93f0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
9400: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
9410: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
9420: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
9430: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
9440: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
9450: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c  _CTX *ctx..= NUL
9460: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
9470: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a  script..= NULL;.
9480: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
9490: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  sword..= NULL;. 
94a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64     Tcl_Obj *vcmd
94b0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
94c0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43  l_DString upperC
94d0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
94e0: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  n, upperChannelB
94f0: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68  locking, upperCh
9500: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75  annelEncoding, u
9510: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9520: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b  ar;.    int idx;
9530: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
9540: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
9550: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  ...= TLS_TCL_INI
9560: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
9570: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63  r...= 0;./* is c
9580: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69  onnection incomi
9590: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20  ng or outgoing? 
95a0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  */.    char *key
95b0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
95c0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
95d0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  ..= NULL;.    un
95e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
95f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9600: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09  l_Size key_len..
9610: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
9620: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20  d char *cert..= 
9630: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
9640: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30  ze cert_len..= 0
9650: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9660: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ers..= NULL;.   
9670: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
9680: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tes..= NULL;.   
9690: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d   char *CAfile..=
96a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
96b0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b  *CApath..= NULL;
96c0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
96d0: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ams..= NULL;.   
96e0: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d   char *model...=
96f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9700: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e  *servername..= N
9710: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
9720: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
9730: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20   Indication */. 
9740: 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e     char *session
9750: 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  _id..= NULL;.   
9760: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09   Tcl_Obj *alpn..
9770: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
9780: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
9790: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
97a0: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
97b0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
97c0: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
97d0: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
97e0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
97f0: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
9800: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
9810: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
9820: 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28  shake = 0;.    (
9830: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
9840: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
9850: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
9860: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
9870: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9880: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
9890: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
98a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
98b0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
98c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
98d0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
98e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
98f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9900: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
9910: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
9920: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
9930: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9940: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
9950: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9960: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9970: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
9980: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
9990: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
99a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
99b0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
99c0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
99d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
99e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
99f0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
9a00: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
9a10: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
9a20: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9a30: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  ring(objv[1]), N
9a40: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
9a50: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
9a60: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
9a70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9a80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
9a90: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
9aa0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
9ab0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
9ac0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
9ad0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
9ae0: 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20  .    for (idx = 
9af0: 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69  2; idx < objc; i
9b00: 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f  dx++) {..char *o
9b10: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
9b20: 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a  ng(objv[idx]);..
9b30: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
9b40: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
9b50: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22  ..OPTOBJ("-alpn"
9b60: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52  , alpn);..OPTSTR
9b70: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74  ("-cadir", CApat
9b80: 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  h);..OPTSTR("-ca
9b90: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a  file", CAfile);.
9ba0: 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22  .OPTBYTE("-cert"
9bb0: 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e  , cert, cert_len
9bc0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72  );..OPTSTR("-cer
9bd0: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65  tfile", certfile
9be0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
9bf0: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  her", ciphers);.
9c00: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9c10: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  s", ciphers);..O
9c20: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75  PTSTR("-ciphersu
9c30: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69  ites", ciphersui
9c40: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  tes);..OPTOBJ("-
9c50: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74  command", script
9c60: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70  );..OPTSTR("-dhp
9c70: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73  arams", DHparams
9c80: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65  );..OPTBYTE("-ke
9c90: 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e  y", key, key_len
9ca0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79  );..OPTSTR("-key
9cb0: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b  file", keyfile);
9cc0: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c  ..OPTSTR("-model
9cd0: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f  ", model);..OPTO
9ce0: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20  BJ("-password", 
9cf0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42  password);..OPTB
9d00: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73  OOL("-post_hands
9d10: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64  hake", post_hand
9d20: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  shake);..OPTBOOL
9d30: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71  ("-request", req
9d40: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
9d50: 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75  "-require", requ
9d60: 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  ire);..OPTINT("-
9d70: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c  security_level",
9d80: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9d90: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9da0: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9db0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9dc0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9dd0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9de0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9df0: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9e00: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9e10: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9e20: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9e30: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9e40: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9e50: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9e60: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9e70: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9e80: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9e90: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9ea0: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9eb0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9ec0: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9ed0: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9ee0: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9ef0: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
9f00: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
9f10: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c  , -ciphersuites,
9f20: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61   -command, -dhpa
9f30: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79  rams, -key, -key
9f40: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70  file, -model, -p
9f50: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68  assword, -post_h
9f60: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65  andshake, -reque
9f70: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73  st, -require, -s
9f80: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d  ecurity_level, -
9f90: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e  server, -servern
9fa0: 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64  ame, -session_id
9fb0: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
9fc0: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20  -tls1, -tls1.1, 
9fd0: 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33  -tls1.2, -tls1.3
9fe0: 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f  , or -validateco
9ff0: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72  mmand");...retur
a000: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a010: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
a020: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53  st)..verify |= S
a030: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
a040: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
a050: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
a060: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
a070: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ire).verify |= S
a080: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
a090: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
a0a0: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
a0b0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
a0c0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e).verify |= SSL
a0d0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
a0e0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28  DSHAKE;.    if (
a0f0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65  verify == 0)..ve
a100: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46  rify = SSL_VERIF
a110: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f  Y_NONE;..    pro
a120: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c  to |= (ssl2 ? TL
a130: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30  S_PROTO_SSL2 : 0
a140: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a150: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl3 ? TLS_PROT
a160: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20  O_SSL3 : 0);.   
a170: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20   proto |= (tls1 
a180: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
a190: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a1a0: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c   |= (tls1_1 ? TL
a1b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a  S_PROTO_TLS1_1 :
a1c0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
a1d0: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f  = (tls1_2 ? TLS_
a1e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30  PROTO_TLS1_2 : 0
a1f0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a200: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52  (tls1_3 ? TLS_PR
a210: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b  OTO_TLS1_3 : 0);
a220: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74  ..    /* reset t
a230: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20  o NULL if blank 
a240: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20  string provided 
a250: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20  */.    if (cert 
a260: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20  && !*cert)..    
a270: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20      cert.       
a280: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a290: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09  (key && !*key)..
a2a0: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20          key.    
a2b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a2c0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20  if (certfile && 
a2d0: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20  !*certfile)     
a2e0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e      certfile.= N
a2f0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
a300: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c  file && !*keyfil
a310: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20  e)..keyfile.    
a320: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a330: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21  if (ciphers && !
a340: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20  *ciphers).      
a350: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20    ciphers.      
a360: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a370: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26   (ciphersuites &
a380: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73  & !*ciphersuites
a390: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20  ) ciphersuites  
a3a0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a3b0: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41   (CAfile && !*CA
a3c0: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41  file).        CA
a3d0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
a3e0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70  ULL;.    if (CAp
a3f0: 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 29  ath && !*CApath)
a400: 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 09  .        CApath.
a410: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a420: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
a430: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
a440: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
a450: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a460: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
a470: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
a480: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
a490: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
a4a0: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
a4b0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
a4c0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
a4d0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
a4e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
a4f0: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
a500: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
a510: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
a520: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
a530: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
a540: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
a550: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
a560: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
a570: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
a580: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a590: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
a5a0: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
a5b0: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a5c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
a5d0: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
a5e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a5f0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
a600: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
a610: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
a620: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
a630: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
a640: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
a650: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
a660: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
a670: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a680: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
a690: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
a6a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a6b0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
a6c0: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
a6d0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a6e0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
a6f0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
a700: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a710: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a720: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
a730: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a740: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
a750: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
a760: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a770: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
a780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a790: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
a7a0: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
a7b0: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
a7c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
a7d0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
a7e0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
a7f0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
a800: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
a810: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
a820: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
a830: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
a840: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a850: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a860: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73  .../*.. * Make s
a870: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
a880: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
a890: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e  annel.. */..chan
a8a0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
a8b0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20  nnel(chan);..if 
a8c0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
a8d0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
a8e0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
a8f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
a900: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a910: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
a920: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
a930: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
a940: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
a950: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20  nnel", (char *) 
a960: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
a970: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
a980: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
a990: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
a9a0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
a9b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a9c0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
a9d0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
a9e0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a9f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
aa00: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
aa10: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
aa20: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
aa30: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
aa40: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
aa50: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
aa60: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
aa70: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
aa80: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
aa90: 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e  t, (int) key_len
aaa0: 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65 72  ,..    (int) cer
aab0: 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43  t_len, CApath, C
aac0: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
aad0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
aae0: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
aaf0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
ab00: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
ab10: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
ab20: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
ab30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
ab40: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65      }..    state
ab50: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a  Ptr->ctx = ctx;.
ab60: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
ab70: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
ab80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
ab90: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69  nnel works in bi
aba0: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20  nary (for the.  
abb0: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20     * encryption 
abc0: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
abd0: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20  d up)..     */. 
abe0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
abf0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ac00: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
ac10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
ac20: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  t(&upperChannelB
ac30: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63  locking);.    Tc
ac40: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
ac50: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
ac60: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ar);.    Tcl_DSt
ac70: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
ac80: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
ac90: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
aca0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
acb0: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61  , chan, "-eofcha
acc0: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  r", &upperChanne
acd0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
ace0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
acf0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ad00: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26  , "-encoding", &
ad10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
ad20: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
ad30: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ad40: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ad50: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75  translation", &u
ad60: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
ad70: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
ad80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ad90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ada0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70  "-blocking", &up
adb0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
adc0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ng);.    Tcl_Set
add0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ade0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
adf0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e  anslation", "bin
ae00: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ary");.    Tcl_S
ae10: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ae20: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ae30: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65  blocking", "true
ae40: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ");.    dprintf(
ae50: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63  "Consuming Tcl c
ae60: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f  hannel %s", Tcl_
ae70: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
ae80: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65  han));.    state
ae90: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f  Ptr->self = Tcl_
aea0: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  StackChannel(int
aeb0: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  erp, Tls_Channel
aec0: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44  Type(), (ClientD
aed0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09  ata) statePtr,..
aee0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20  (TCL_READABLE | 
aef0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63  TCL_WRITABLE), c
af00: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  han);.    dprint
af10: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e  f("Created chann
af20: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63  el named %s", Tc
af30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
af40: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
af50: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  );.    if (state
af60: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
af70: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
af80: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73   {../*.. * No us
af90: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61  e of Tcl_Eventua
afa0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20  llyFree because 
afb0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f  no possible Tcl_
afc0: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09  Preserve... */..
afd0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
afe0: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
aff0: 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  Ptr);..Tcl_DStri
b000: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b010: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
b020: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ;..Tcl_DStringFr
b030: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b040: 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f  Encoding);..Tcl_
b050: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b060: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
b070: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
b080: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b090: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74  lBlocking);..ret
b0a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b0b0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65     }..    Tcl_Se
b0c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b0d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b0e0: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61  >self, "-transla
b0f0: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69  tion", Tcl_DStri
b100: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b110: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b120: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
b130: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b140: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b150: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  elf, "-encoding"
b160: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b170: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b180: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20  Encoding));.    
b190: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
b1a0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
b1b0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65  tePtr->self, "-e
b1c0: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74  ofchar", Tcl_DSt
b1d0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b1e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29  ChannelEOFChar))
b1f0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
b200: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
b210: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
b220: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  f, "-blocking", 
b230: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b240: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
b250: 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  ocking));.    Tc
b260: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
b270: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
b280: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
b290: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b2a0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b2b0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
b2c0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
b2d0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
b2e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
b2f0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b300: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20  lBlocking);..   
b310: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49   /*.     * SSL I
b320: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
b330: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50     */.    stateP
b340: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
b350: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
b360: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
b370: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
b380: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f  SSL library erro
b390: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  r */..Tcl_Append
b3a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b3b0: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75  couldn't constru
b3c0: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20  ct ssl session: 
b3d0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
b3e0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
b3f0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b400: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b410: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b420: 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49  T", "INIT", "FAI
b430: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b440: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28  ULL);..Tls_Free(
b450: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
b460: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
b470: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b480: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
b490: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61  t host server na
b4a0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  me */.    if (se
b4b0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20  rvername) {../* 
b4c0: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20  Sets the server 
b4d0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
b4e0: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48  (SNI) in ClientH
b4f0: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ello extension *
b500: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30  /../* Per RFC 60
b510: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  66, hostname is 
b520: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20  a ASCII encoded 
b530: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52  string, though R
b540: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46  FC 4366 says UTF
b550: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  -8. */..if (!SSL
b560: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
b570: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
b580: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b590: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
b5a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b5b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
b5c0: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20  t SNI extension 
b5d0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b5e0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b5f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b600: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b610: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b620: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
b630: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b640: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b650: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
b660: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
b670: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b680: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b690: 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e  }.../* Set hostn
b6a0: 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72  ame for peer cer
b6b0: 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d  tificate hostnam
b6c0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69  e verification i
b6d0: 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44  n clients...   D
b6e0: 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74  on't use SSL_set
b6f0: 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20  1_host since it 
b700: 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e  has limitations.
b710: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64   */..if (!SSL_ad
b720: 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72  d1_host(statePtr
b730: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
b740: 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  e)) {..    Tcl_A
b750: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b760: 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73  rp, "Set DNS hos
b770: 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c  tname failed: ",
b780: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
b790: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
b7a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b7b0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b7c0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b7d0: 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46  , "HOSTNAME", "F
b7e0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b7f0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
b800: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
b810: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72  type *) statePtr
b820: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b830: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
b840: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d   }..    /* Resum
b850: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  e session id */.
b860: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f      if (session_
b870: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73  id && strlen(ses
b880: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f  sion_id) <= SSL_
b890: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47  MAX_SID_CTX_LENG
b8a0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65  TH) {../* SSL_se
b8b0: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09  t_session() */..
b8c0: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e  if (!SSL_SESSION
b8d0: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74  _set1_id_context
b8e0: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e  (SSL_get_session
b8f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
b900: 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ...(const unsign
b910: 65 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 69  ed char *) sessi
b920: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64  on_id, (unsigned
b930: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73   int) strlen(ses
b940: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20  sion_id))) {..  
b950: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b960: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75  lt(interp, "Resu
b970: 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65  me session faile
b980: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b990: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b9a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b9b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b9c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b9d0: 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22  PORT", "SESSION"
b9e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b9f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
ba00: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
ba10: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
ba20: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
ba30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
ba40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
ba50: 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f  nable Applicatio
ba60: 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c  n-Layer Protocol
ba70: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78   Negotiation. Ex
ba80: 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70  amples are: http
ba90: 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c  /1.0,..http/1.1,
baa0: 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d   h2, h3, ftp, im
bab0: 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63  ap, pop3, xmpp-c
bac0: 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76  lient, xmpp-serv
bad0: 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65  er, mqtt, irc, e
bae0: 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61  tc. */.    if (a
baf0: 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65  lpn) {../* Conve
bb00: 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e  rt a TCL list in
bb10: 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  to a protocol-li
bb20: 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61  st in wire-forma
bb30: 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63  t */..unsigned c
bb40: 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b  har *protos, *p;
bb50: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70  ..unsigned int p
bb60: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09  rotos_len = 0;..
bb70: 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b  Tcl_Size cnt, i;
bb80: 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62  ..int j;..Tcl_Ob
bb90: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28  j **list;...if (
bba0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
bbb0: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61  ements(interp, a
bbc0: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  lpn, &cnt, &list
bbd0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
bbe0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
bbf0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
bc00: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
bc10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bc20: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
bc30: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  ne the memory re
bc40: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70  quired for the p
bc50: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
bc60: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
bc70: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
bc80: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
bc90: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20  romObj(list[i], 
bca0: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
bcb0: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54  len > 255) {...T
bcc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bcd0: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72  interp, "ALPN pr
bce0: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f  otocol names too
bcf0: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29   long", (char *)
bd00: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65   NULL);...Tcl_Se
bd10: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
bd20: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
bd30: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49  T", "ALPN", "FAI
bd40: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
bd50: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65  ULL);...Tls_Free
bd60: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
bd70: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09  *) statePtr);...
bd80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bd90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72  ;..    }..    pr
bda0: 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20  otos_len += 1 + 
bdb0: 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09  (int) len;..}...
bdc0: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d  /* Build the com
bdd0: 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  plete protocol-l
bde0: 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d  ist */..protos =
bdf0: 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f   ckalloc(protos_
be00: 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63  len);../* protoc
be10: 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74  ol-lists consist
be20: 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68   of 8-bit length
be30: 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20  -prefixed, byte 
be40: 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20  strings */..for 
be50: 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74  (j = 0, p = prot
be60: 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b  os; j < cnt; j++
be70: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73  ) {..    char *s
be80: 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  tr = Tcl_GetStri
be90: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a  ngFromObj(list[j
bea0: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a  ], &len);..    *
beb0: 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  p++ = (unsigned 
bec0: 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20  char) len;..    
bed0: 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28  memcpy(p, str, (
bee0: 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20  size_t) len);.. 
bef0: 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a     p += len;..}.
bf00: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70  ../* SSL_set_alp
bf10: 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61  n_protos makes a
bf20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f   copy of the pro
bf30: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f  tocol-list */../
bf40: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e  * Note: This fun
bf50: 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74  ction reverses t
bf60: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
bf70: 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69  convention */..i
bf80: 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  f (SSL_set_alpn_
bf90: 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d  protos(statePtr-
bfa0: 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72  >ssl, protos, pr
bfb0: 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20  otos_len)) {..  
bfc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
bfd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
bfe0: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66  ALPN protocols f
bff0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
c000: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
c010: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
c020: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
c030: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
c040: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e   "IMPORT", "ALPN
c050: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
c060: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
c070: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
c080: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
c090: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66  tePtr);..    ckf
c0a0: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20  ree(protos);..  
c0b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c0c0: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72  OR;..}.../* Stor
c0d0: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  e protocols list
c0e0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70   */..statePtr->p
c0f0: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a  rotos = protos;.
c100: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
c110: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c  s_len = protos_l
c120: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  en;.    } else {
c130: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
c140: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74  os = NULL;..stat
c150: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
c160: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
c170: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43   /*.     * SSL C
c180: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f  allbacks.     */
c190: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70  .    SSL_set_app
c1a0: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e  _data(statePtr->
c1b0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
c1c0: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74  tePtr);./* point
c1d0: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20   back to us */. 
c1e0: 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66     SSL_set_verif
c1f0: 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  y(statePtr->ssl,
c200: 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43   verify, VerifyC
c210: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53  allback);.    SS
c220: 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62  L_set_info_callb
c230: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ack(statePtr->ss
c240: 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29  l, InfoCallback)
c250: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61  ;..    /* Callba
c260: 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67  ck for observing
c270: 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67   protocol messag
c280: 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50  es */.#ifndef OP
c290: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41  ENSSL_NO_SSL_TRA
c2a0: 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53  CE.    /* void S
c2b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63  SL_CTX_set_msg_c
c2c0: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74  allback_arg(stat
c2d0: 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64  ePtr->ctx, (void
c2e0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20   *)statePtr);.  
c2f0: 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73    void SSL_CTX_s
c300: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28  et_msg_callback(
c310: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d  statePtr->ctx, M
c320: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b  essageCallback);
c330: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
c340: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
c350: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c360: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c370: 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d  );.    SSL_set_m
c380: 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  sg_callback(stat
c390: 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61  ePtr->ssl, Messa
c3a0: 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e  geCallback);.#en
c3b0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  dif..    /* Crea
c3c0: 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42  te Tcl_Channel B
c3d0: 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  IO Handler */.  
c3e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69    statePtr->p_bi
c3f0: 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28  o.= BIO_new_tcl(
c400: 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f  statePtr, BIO_NO
c410: 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74  CLOSE);.    stat
c420: 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f  ePtr->bio.= BIO_
c430: 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29  new(BIO_f_ssl())
c440: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  ;..    if (serve
c450: 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20  r) {../* Server 
c460: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53  callbacks */..SS
c470: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74  L_CTX_set_tlsext
c480: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28  _servername_arg(
c490: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28  statePtr->ctx, (
c4a0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c4b0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  ;..SSL_CTX_set_t
c4c0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
c4d0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c4e0: 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c  tr->ctx, SNICall
c4f0: 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  back);..SSL_CTX_
c500: 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  set_client_hello
c510: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c520: 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b  x, HelloCallback
c530: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c540: 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50  tr);..if (stateP
c550: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55  tr->protos != NU
c560: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43  LL) {..    SSL_C
c570: 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65  TX_set_alpn_sele
c580: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
c590: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
c5a0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c5b0: 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45  Ptr);.#ifdef USE
c5c0: 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c  _NPN..    if (tl
c5d0: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73  s1_2 == 0 && tls
c5e0: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53  1_3 == 0) {...SS
c5f0: 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70  L_CTX_set_next_p
c600: 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64  rotos_advertised
c610: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c620: 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  x, NPNCallback, 
c630: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c640: 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66  );..    }.#endif
c650: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  ..}.../* Enable 
c660: 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63  server to send c
c670: 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65  ert request afte
c680: 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53  r handshake (TLS
c690: 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f   1.3 only) */../
c6a0: 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74  * A write operat
c6b0: 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c  ion must take pl
c6c0: 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74  ace for the Cert
c6d0: 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20  ificate Request 
c6e0: 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74  to be..   sent t
c6f0: 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68  o the client, th
c700: 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77  is can be done w
c710: 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73  ith SSL_do_hands
c720: 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28  hake(). */..if (
c730: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f  request && post_
c740: 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73  handshake && tls
c750: 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  1_3) {..    SSL_
c760: 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f  verify_client_po
c770: 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61  st_handshake(sta
c780: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a  tePtr->ssl);..}.
c790: 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74  ../* set automat
c7a0: 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69  ic curve selecti
c7b0: 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65  on */..SSL_set_e
c7c0: 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74  cdh_auto(statePt
c7d0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a  r->ssl, 1);.../*
c7e0: 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65   Set server mode
c7f0: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66   */..statePtr->f
c800: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
c810: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74  SERVER;..SSL_set
c820: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74  _accept_state(st
c830: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
c840: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43    } else {../* C
c850: 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20  lient callbacks 
c860: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
c870: 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  N..if (statePtr-
c880: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20  >protos != NULL 
c890: 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  && tls1_2 == 0 &
c8a0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c8b0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
c8c0: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c  t_next_proto_sel
c8d0: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c8e0: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c8f0: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c900: 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  ePtr);..}.#endif
c910: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61  .../* Session ca
c920: 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54  ching */..SSL_CT
c930: 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_set_session_ca
c940: 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
c950: 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53  r->ctx, SSL_SESS
c960: 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20  _CACHE_CLIENT | 
c970: 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e  SSL_SESS_CACHE_N
c980: 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45  O_INTERNAL_STORE
c990: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73  );..SSL_CTX_sess
c9a0: 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74  _set_new_cb(stat
c9b0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69  ePtr->ctx, Sessi
c9c0: 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f  onCallback);.../
c9d0: 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61  * Enable post ha
c9e0: 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69  ndshake Authenti
c9f0: 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e  cation extension
ca00: 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20  . TLS 1.3 only, 
ca10: 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09  not http/2. */..
ca20: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
ca30: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b  ost_handshake) {
ca40: 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f  ..    SSL_set_po
ca50: 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74  st_handshake_aut
ca60: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  h(statePtr->ssl,
ca70: 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74   1);..}.../* Set
ca80: 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a   client mode */.
ca90: 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74  .SSL_set_connect
caa0: 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d  _state(statePtr-
cab0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
cac0: 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61   SSL_set_bio(sta
cad0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74  tePtr->ssl, stat
cae0: 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61  ePtr->p_bio, sta
caf0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20  tePtr->p_bio);. 
cb00: 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73     BIO_set_ssl(s
cb10: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74  tatePtr->bio, st
cb20: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f  atePtr->ssl, BIO
cb30: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20  _NOCLOSE);..    
cb40: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66  /*.     * End of
cb50: 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a   SSL Init.     *
cb60: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  /.    dprintf("R
cb70: 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63  eturning %s", Tc
cb80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
cb90: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
cba0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  );.    Tcl_SetRe
cbb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
cbc0: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  ar *) Tcl_GetCha
cbd0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
cbe0: 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f  r->self), TCL_VO
cbf0: 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65  LATILE);..    re
cc00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
cc10: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
cc60: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
cc70: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
cc80: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
cc90: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
cca0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
ccb0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
ccc0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
ccd0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
cce0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
ccf0: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
cd00: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
cd10: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
cd20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
cd70: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
cd80: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
cd90: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
cda0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
cdb0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
cdc0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
cdd0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
cde0: 68 61 6e 6e 65 6c 20 63 68 61 6e 2c 20 63 68 69  hannel chan, chi
cdf0: 6c 64 3b 09 2f 2a 20 54 68 65 20 73 74 61 63 6b  ld;./* The stack
ce00: 65 64 20 61 6e 64 20 75 6e 64 65 72 6c 79 69 6e  ed and underlyin
ce10: 67 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20  g channels */.  
ce20: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
ce30: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
ce40: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
ce50: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
ce60: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
ce70: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
ce80: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
ce90: 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20  res = TCL_OK;.  
cea0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
ceb0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ata;..    dprint
cec0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
ced0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
cee0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
cef0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
cf00: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
cf10: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
cf20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
cf30: 2f 2a 20 56 61 6c 69 64 61 74 65 20 63 68 61 6e  /* Validate chan
cf40: 6e 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  nel name */.    
cf50: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
cf60: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63  annel(interp, Tc
cf70: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cf80: 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  [1]), NULL);.   
cf90: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
cfa0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
cfb0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
cfc0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
cfd0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
cfe0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
cff0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
d000: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
d010: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
d020: 63 68 61 6e 29 3b 0a 20 20 20 20 63 68 69 6c 64  chan);.    child
d030: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
d040: 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  dChannel(chan);.
d050: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 69  .    /* Verify i
d060: 73 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e  s a stacked chan
d070: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  nel */.    if (c
d080: 68 69 6c 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  hild == NULL) {.
d090: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d0a0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
d0b0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
d0c0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
d0d0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
d0e0: 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e   a stacked chann
d0f0: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  el", (char *) NU
d100: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
d110: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
d120: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50  p, "TLS", "UNIMP
d130: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
d140: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
d150: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
d160: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d170: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c 75     }..    /* Flu
d180: 73 68 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 64  sh any pending d
d190: 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 54  ata */.    if (T
d1a0: 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 29 20 21  cl_Flush(chan) !
d1b0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
d1c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d1d0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
d1e0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
d1f0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d200: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
d210: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
d220: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
d230: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d240: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
d250: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d260: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
d270: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
d280: 6f 64 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  oding);..    /* 
d290: 47 65 74 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  Get current conf
d2a0: 69 67 20 2d 20 45 4f 4c 20 74 72 61 6e 73 6c 61  ig - EOL transla
d2b0: 74 69 6f 6e 2c 20 65 6e 63 6f 64 69 6e 67 20 61  tion, encoding a
d2c0: 6e 64 20 62 75 66 66 65 72 69 6e 67 20 6f 70 74  nd buffering opt
d2d0: 69 6f 6e 73 20 61 72 65 20 73 68 61 72 65 64 20  ions are shared 
d2e0: 62 65 74 77 65 65 6e 20 61 6c 6c 20 63 68 61 6e  between all chan
d2f0: 6e 65 6c 73 20 69 6e 20 74 68 65 20 73 74 61 63  nels in the stac
d300: 6b 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47 65 74  k */.    Tcl_Get
d310: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
d320: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
d330: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43  ocking", &upperC
d340: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
d350: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
d360: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d370: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
d380: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
d390: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
d3a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
d3b0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
d3c0: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20  an, "-eofchar", 
d3d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
d3e0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47  Char);.    Tcl_G
d3f0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d400: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
d410: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75  translation", &u
d420: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
d430: 6c 61 74 69 6f 6e 29 3b 0a 0a 20 20 20 20 2f 2a  lation);..    /*
d440: 20 55 6e 73 74 61 63 6b 20 74 68 65 20 63 68 61   Unstack the cha
d450: 6e 6e 65 6c 20 61 6e 64 20 72 65 73 74 6f 72 65  nnel and restore
d460: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e   underlying chan
d470: 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20  nel config */.  
d480: 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63    if (Tcl_Unstac
d490: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
d4a0: 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 4f 4b   chan) == TCL_OK
d4b0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e  ) {..Tcl_SetChan
d4c0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d4d0: 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6e 63 6f 64  , child, "-encod
d4e0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
d4f0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
d500: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a  nnelEncoding));.
d510: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f  .Tcl_SetChannelO
d520: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
d530: 69 6c 64 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  ild, "-eofchar",
d540: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
d550: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
d560: 4f 46 43 68 61 72 29 29 3b 0a 09 54 63 6c 5f 53  OFChar));..Tcl_S
d570: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d580: 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22  interp, child, "
d590: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54  -translation", T
d5a0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
d5b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
d5c0: 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 09 54 63 6c  nslation));..Tcl
d5d0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
d5e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c  n(interp, child,
d5f0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
d600: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
d610: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
d620: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 7d 20 65 6c  king));.    } el
d630: 73 65 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f  se {..res = TCL_
d640: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d650: 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f    /* Clean-up */
d660: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d670: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d680: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
d690: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
d6a0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
d6b0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
d6c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d6d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
d6e0: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
d6f0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
d700: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
d710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
d720: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d770: 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d   *. * CTX_Init -
d780: 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53  - construct a SS
d790: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20  L_CTX instance. 
d7a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
d7b0: 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58  .A valid SSL_CTX
d7c0: 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c   instance or NUL
d7d0: 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  L.. *. * Side ef
d7e0: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
d7f0: 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74  ucts SSL context
d800: 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d   (CTX). *. *----
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d850: 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43   */.static SSL_C
d860: 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74  TX *.CTX_Init(St
d870: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69  ate *statePtr, i
d880: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74  nt isServer, int
d890: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65   proto, char *ke
d8a0: 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72  yfile, char *cer
d8b0: 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67  tfile,.    unsig
d8c0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75  ned char *key, u
d8d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
d8e0: 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c  rt, int key_len,
d8f0: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63   int cert_len, c
d900: 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20  har *CApath,.   
d910: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63   char *CAfile, c
d920: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68  har *ciphers, ch
d930: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
d940: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61  , int level, cha
d950: 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20  r *DHparams) {. 
d960: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
d970: 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72  nterp = statePtr
d980: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53  ->interp;.    SS
d990: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
d9a0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
d9b0: 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f  ng ds;.    int o
d9c0: 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20  ff = 0, abort = 
d9d0: 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f  0;.    int load_
d9e0: 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20  private_key;.   
d9f0: 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f   const SSL_METHO
da00: 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20  D *method;..    
da10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
da20: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f  );..    if (!pro
da30: 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  to) {..Tcl_Appen
da40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
da50: 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63  "no valid protoc
da60: 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63  ol selected", (c
da70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
da80: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
da90: 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65  }..    /* create
daa0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
dab0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
dac0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
dad0: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66  10100000L || def
dae0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c  ined(NO_SSL2) ||
daf0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
db00: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66  _NO_SSL2).    if
db10: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
db20: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29   TLS_PROTO_SSL2)
db30: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
db40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
db50: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL2 protocol not
db60: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
db70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
db80: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
db90: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
dba0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20  ned(NO_SSL3) || 
dbb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
dbc0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20  NO_SSL3).    if 
dbd0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dbe0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29  TLS_PROTO_SSL3))
dbf0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
dc00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
dc10: 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L3 protocol not 
dc20: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
dc30: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
dc40: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
dc50: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dc60: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
dc70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dc80: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28  O_TLS1).    if (
dc90: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
dca0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20  LS_PROTO_TLS1)) 
dcb0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
dcc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
dcd0: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.0 protocol no
dce0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
dcf0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
dd00: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
dd10: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
dd20: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
dd30: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
dd40: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
dd50: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
dd60: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
dd70: 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_1)) {..Tcl_A
dd80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dd90: 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f  rp, "TLS 1.1 pro
dda0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
ddb0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
ddc0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
ddd0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
dde0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
ddf0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
de00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
de10: 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_2).    if (EN
de20: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
de30: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20  _PROTO_TLS1_2)) 
de40: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
de50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
de60: 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.2 protocol no
de70: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
de80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
de90: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
dea0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
deb0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
dec0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
ded0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
dee0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
def0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
df00: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_3)) {..Tcl_A
df10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
df20: 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f  rp, "TLS 1.3 pro
df30: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
df40: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
df50: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
df60: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
df70: 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d  .    if (proto =
df80: 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66  = 0) {../* Use f
df90: 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53  ull range */..SS
dfa0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
dfb0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
dfc0: 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65   0);..SSL_CTX_se
dfd0: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73  t_max_proto_vers
dfe0: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20  ion(ctx, 0);.   
dff0: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28   }..    switch (
e000: 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45  proto) {.#if OPE
e010: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
e020: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
e030: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f  L && !defined(NO
e040: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
e050: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
e060: 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  L2).    case TLS
e070: 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65  _PROTO_SSL2:..me
e080: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
e090: 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d  ? SSLv2_server_m
e0a0: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f  ethod() : SSLv2_
e0b0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
e0c0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
e0d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e0e0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
e0f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
e100: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
e110: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
e120: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
e130: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a  TLS_PROTO_SSL3:.
e140: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e150: 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65  er ? SSLv3_serve
e160: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c  r_method() : SSL
e170: 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  v3_client_method
e180: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e190: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e1a0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
e1b0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e1c0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
e1d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e1e0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  1_METHOD).    ca
e1f0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
e200: 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  1:..method = isS
e210: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65  erver ? TLSv1_se
e220: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e230: 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74  TLSv1_client_met
e240: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
e250: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
e260: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
e270: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e280: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  L_NO_TLS1_1) && 
e290: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e2a0: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
e2b0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
e2c0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d  PROTO_TLS1_1:..m
e2d0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
e2e0: 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65   ? TLSv1_1_serve
e2f0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53  r_method() : TLS
e300: 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  v1_1_client_meth
e310: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e320: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e330: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  d(NO_TLS1_2) && 
e340: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e350: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  _NO_TLS1_2) && !
e360: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e370: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
e380: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
e390: 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65  ROTO_TLS1_2:..me
e3a0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
e3b0: 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72  ? TLSv1_2_server
e3c0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
e3d0: 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  1_2_client_metho
e3e0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e3f0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e400: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
e410: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e420: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63  NO_TLS1_3).    c
e430: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
e440: 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68  S1_3:../* Use th
e450: 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64  e generic method
e460: 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20   and constraint 
e470: 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74  range after cont
e480: 65 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a  ext is created *
e490: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  /..method = isSe
e4a0: 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65  rver ? TLS_serve
e4b0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53  r_method() : TLS
e4c0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
e4d0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
e4e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f  .    default:../
e4f0: 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68  * Negotiate high
e500: 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53  est available SS
e510: 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f  L/TLS version */
e520: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e530: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72  ver ? TLS_server
e540: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f  _method() : TLS_
e550: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
e560: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
e570: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
e580: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
e590: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
e5a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e5b0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66  SL_NO_SSL2)..off
e5c0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
e5d0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
e5e0: 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L2)   ? 0 : SSL_
e5f0: 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65  OP_NO_SSLv2);.#e
e600: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e610: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
e620: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e630: 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL3)..off |= 
e640: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e650: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20  TLS_PROTO_SSL3) 
e660: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
e670: 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66  O_SSLv3);.#endif
e680: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e690: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
e6a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e6b0: 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  S1)..off |= (ENA
e6c0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e6d0: 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20  PROTO_TLS1)   ? 
e6e0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
e6f0: 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Sv1);.#endif.#if
e700: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e710: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
e720: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e730: 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _1)..off |= (ENA
e740: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e750: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20  PROTO_TLS1_1) ? 
e760: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
e770: 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_1);.#endif.#
e780: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e790: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
e7a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e7b0: 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_2)..off |= (E
e7c0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e7d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20  S_PROTO_TLS1_2) 
e7e0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e7f0: 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66  TLSv1_2);.#endif
e800: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e810: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
e820: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e830: 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_3)..off |= 
e840: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e850: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
e860: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e870: 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64  O_TLSv1_3);.#end
e880: 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  if..break;.    }
e890: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
e8a0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74  error();..    ct
e8b0: 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28  x = SSL_CTX_new(
e8c0: 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20  method);.    if 
e8d0: 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e  (!ctx) {..return
e8e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
e8f0: 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c    if (getenv(SSL
e900: 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09  KEYLOGFILE)) {..
e910: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c  SSL_CTX_set_keyl
e920: 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c  og_callback(ctx,
e930: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29   KeyLogCallback)
e940: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
e950: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
e960: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e970: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
e980: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
e990: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
e9a0: 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  3) {..SSL_CTX_se
e9b0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
e9c0: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
e9d0: 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43  VERSION);..SSL_C
e9e0: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
e9f0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
ea00: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  S1_3_VERSION);. 
ea10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
ea20: 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72   /* Force cipher
ea30: 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72   selection order
ea40: 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20   by server */.  
ea50: 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29    if (!isServer)
ea60: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
ea70: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
ea80: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45  _OP_CIPHER_SERVE
ea90: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20  R_PREFERENCE);. 
eaa0: 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
eab0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
eac0: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20   < 0x10100000L. 
ead0: 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61     OpenSSL_add_a
eae0: 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b  ll_algorithms();
eaf0: 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73   /* Load ciphers
eb00: 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a   and digests */.
eb10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f  #endif..    SSL_
eb20: 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61  CTX_set_app_data
eb30: 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74  (ctx, (void*)int
eb40: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65  erp);./* remembe
eb50: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
eb60: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  r */.    SSL_CTX
eb70: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
eb80: 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f  , SSL_OP_ALL);./
eb90: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f  * all SSL bug wo
eba0: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20  rkarounds */.   
ebb0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
ebc0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
ebd0: 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29  _NO_COMPRESSION)
ebe0: 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d  ;./* disable com
ebf0: 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66  pression even if
ec00: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
ec10: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
ec20: 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b  tions(ctx, off);
ec30: 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f  ../* disable pro
ec40: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a  tocol versions *
ec50: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
ec60: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
ec70: 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53  x10101000L.    S
ec80: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28  SL_CTX_set_mode(
ec90: 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55  ctx, SSL_MODE_AU
eca0: 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61  TO_RETRY);./* ha
ecb0: 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61  ndle new handsha
ecc0: 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e  kes in backgroun
ecd0: 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74  d. On by default
ece0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e   in OpenSSL 1.1.
ecf0: 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  1. */.#endif.   
ed00: 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65   SSL_CTX_sess_se
ed10: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78  t_cache_size(ctx
ed20: 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20  , 128);..    /* 
ed30: 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64  Set user defined
ed40: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
ed50: 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63   suites, and sec
ed60: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20  urity level */. 
ed70: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20     if ((ciphers 
ed80: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c  != NULL) && !SSL
ed90: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f  _CTX_set_cipher_
eda0: 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72  list(ctx, cipher
edb0: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
edc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
edd0: 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69  "Set ciphers fai
ede0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69  led: No valid ci
edf0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29  phers", (char *)
ee00: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
ee10: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
ee20: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
ee30: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
ee40: 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26  uites != NULL) &
ee50: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  & !SSL_CTX_set_c
ee60: 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c  iphersuites(ctx,
ee70: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20   ciphersuites)) 
ee80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
ee90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
eea0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66   cipher suites f
eeb0: 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20  ailed: No valid 
eec0: 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20  ciphers", (char 
eed0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
eee0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
eef0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
ef00: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65  }..    /* Set se
ef10: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
ef20: 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20      if (level > 
ef30: 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29  -1 && level < 6)
ef40: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73   {../* SSL_set_s
ef50: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f  ecurity_level */
ef60: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65  ..SSL_CTX_set_se
ef70: 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78  curity_level(ctx
ef80: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  , level);.    }.
ef90: 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65  .    /* set some
efa0: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20   callbacks */.  
efb0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65    SSL_CTX_set_de
efc0: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28  fault_passwd_cb(
efd0: 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c  ctx, PasswordCal
efe0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f  lback);.    SSL_
eff0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
f000: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61  passwd_cb_userda
f010: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  ta(ctx, (void *)
f020: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
f030: 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65  /* read a Diffie
f040: 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74  -Hellman paramet
f050: 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65  ers file, or use
f060: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e   the built-in on
f070: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74  e */.    Tcl_DSt
f080: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23  ringInit(&ds);.#
f090: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f  ifdef OPENSSL_NO
f0a0: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61  _DH.    if (DHpa
f0b0: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rams != NULL) {.
f0c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f0d0: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61  t(interp, "DH pa
f0e0: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20  rameter support 
f0f0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20  not available", 
f100: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f110: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
f120: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
f130: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
f140: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66    {..DH* dh;..if
f150: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55   (DHparams != NU
f160: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a  LL) {..    BIO *
f170: 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d  bio;...    bio =
f180: 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32   BIO_new_file(F2
f190: 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29  N(DHparams, &ds)
f1a0: 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20  , "r");..    if 
f1b0: 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44  (!bio) {...Tcl_D
f1c0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f1d0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
f1e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
f1f0: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70  ld not find DH p
f200: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c  arameters file",
f210: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f220: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
f230: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
f240: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ULL;..    }...  
f250: 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f    dh = PEM_read_
f260: 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f  bio_DHparams(bio
f270: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
f280: 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72  LL);..    BIO_fr
f290: 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63  ee(bio);..    Tc
f2a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f2b0: 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68  s);..    if (!dh
f2c0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
f2d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f2e0: 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44  Could not read D
f2f0: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f  H parameters fro
f300: 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  m file", (char *
f310: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
f320: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
f330: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
f340: 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58    }..    SSL_CTX
f350: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c  _set_tmp_dh(ctx,
f360: 20 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72   dh);..    DH_fr
f370: 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65  ee(dh);...} else
f380: 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77   {..    /* Use w
f390: 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72  ell known DH par
f3a0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76  ameters that hav
f3b0: 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f  e built-in suppo
f3c0: 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f  rt in OpenSSL */
f3d0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
f3e0: 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63  TX_set_dh_auto(c
f3f0: 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f  tx, 1)) {...Tcl_
f400: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f410: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
f420: 65 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75  enable set DH au
f430: 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  to: ", GET_ERR_R
f440: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
f450: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
f460: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
f470: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
f480: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e    }..}.    }.#en
f490: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20  dif..    /* set 
f4a0: 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20  our certificate 
f4b0: 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76  */.    load_priv
f4c0: 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20  ate_key = 0;.   
f4d0: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d   if (certfile !=
f4e0: 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70   NULL) {..load_p
f4f0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a  rivate_key = 1;.
f500: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
f510: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
f520: 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74  le(ctx, F2N(cert
f530: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f  file, &ds), SSL_
f540: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
f550: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44   0) {..    Tcl_D
f560: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f570: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
f580: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f590: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
f5a0: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22  rtificate file "
f5b0: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22  , certfile, ": "
f5c0: 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53  ,...GET_ERR_REAS
f5d0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
f5e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
f5f0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
f600: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
f610: 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  .}..Tcl_DStringF
f620: 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d  ree(&ds);..    }
f630: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21   else if (cert !
f640: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
f650: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
f660: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
f670: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53  e_certificate_AS
f680: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e  N1(ctx, cert_len
f690: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a  , cert) <= 0) {.
f6a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
f6b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
f6c0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
f6d0: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 47  tificate: ",...G
f6e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
f6f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f700: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
f710: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
f720: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  turn NULL;..}.  
f730: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74    } else {..cert
f740: 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35  file = (char*)X5
f750: 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63  09_get_default_c
f760: 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66  ert_file();...if
f770: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
f780: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63  rtificate_file(c
f790: 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53  tx, certfile, SS
f7a0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
f7b0: 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20  <= 0) {.#if 0.. 
f7c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f7d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
f7e0: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75  ble to use defau
f7f0: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  lt certificate f
f800: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
f810: 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52   ": ",...GET_ERR
f820: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
f830: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
f840: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f850: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f860: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20  ULL;.#endif..}. 
f870: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74     }..    /* set
f880: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79   our private key
f890: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64   */.    if (load
f8a0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a  _private_key) {.
f8b0: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20  .if (keyfile == 
f8c0: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e  NULL && key == N
f8d0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66  ULL) {..    keyf
f8e0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
f8f0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  .}...if (keyfile
f900: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
f910: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76   /* get the priv
f920: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  ate key associat
f930: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72  ed with this cer
f940: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
f950: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20   if (keyfile == 
f960: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c  NULL) {...keyfil
f970: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20  e = certfile;.. 
f980: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53     }...    if (S
f990: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
f9a0: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20  teKey_file(ctx, 
f9b0: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73  F2N(keyfile, &ds
f9c0: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
f9d0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54  PEM) <= 0) {...T
f9e0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f9f0: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  ds);.../* flush 
fa00: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
fa10: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
fa20: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
fa30: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
fa40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
fa50: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
fa60: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
fa70: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
fa80: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
fa90: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66  key file ", keyf
faa0: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20  ile, " ",...    
fab0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
fac0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
fad0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
fae0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
faf0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20  NULL;..    }..  
fb00: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
fb10: 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65  e(&ds);...} else
fb20: 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c   if (key != NULL
fb30: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c  ) {..    if (SSL
fb40: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
fb50: 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45  Key_ASN1(EVP_PKE
fb60: 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c  Y_RSA, ctx, key,
fb70: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b  key_len) <= 0) {
fb80: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
fb90: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
fba0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
fbb0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
fbc0: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
fbd0: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
fbe0: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
fbf0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fc00: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
fc10: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a   set public key:
fc20: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
fc30: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
fc40: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
fc50: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
fc60: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
fc70: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b  ..}../* Now we k
fc80: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61  now that a key a
fc90: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65  nd cert have bee
fca0: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20  n set against.. 
fcb0: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78  * the SSL contex
fcc0: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43  t */..if (!SSL_C
fcd0: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65  TX_check_private
fce0: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20  _key(ctx)) {..  
fcf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
fd00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76  lt(interp, "priv
fd10: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ate key does not
fd20: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69   match the certi
fd30: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65  ficate public ke
fd40: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61  y",....     (cha
fd50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
fd60: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
fd70: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
fd80: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  NULL;..}.    }..
fd90: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73      /* Set to us
fda0: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69  e default locati
fdb0: 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20  on and file for 
fdc0: 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68  Certificate Auth
fdd0: 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69  ority (CA) certi
fde0: 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20  ficates. The.   
fdf0: 20 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20    * verify path 
fe00: 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65  and store can be
fe10: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
fe20: 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20  he SSL_CERT_DIR 
fe30: 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72  env var. The ver
fe40: 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20  ify file can.   
fe50: 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65    * be overridde
fe60: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
fe70: 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20  T_FILE env var. 
fe80: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
fe90: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
fea0: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
feb0: 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20  )) {..abort++;. 
fec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
fed0: 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43  rrides for the C
fee0: 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e  A verify path an
fef0: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a  d file */.    {.
ff00: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
ff10: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
ff20: 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41  0000000L..if (CA
ff30: 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  path != NULL || 
ff40: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
ff50: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
ff60: 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c  ng ds1;..    Tcl
ff70: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
ff80: 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53  1);...    if (!S
ff90: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
ffa0: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78  fy_locations(ctx
ffb0: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  , F2N(CAfile, &d
ffc0: 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  s), F2N(CApath, 
ffd0: 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72  &ds1))) {...abor
ffe0: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
fff0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
10000 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
10010 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31  DStringFree(&ds1
10020 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20  );...    /* Set 
10030 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73  list of CAs to s
10040 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68  end to client wh
10050 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  en requesting a 
10060 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61  client certifica
10070 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74  te */..    /* ht
10080 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67  tps://sourceforg
10090 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73  e.net/p/tls/bugs
100a0 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  /57/ */..    /* 
100b0 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68  XXX:TODO: Let th
100c0 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61  e user supply va
100d0 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61  lues here instea
100e0 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74  d of something t
100f0 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68  hat exists on th
10100 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a  e filesystem */.
10110 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
10120 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
10130 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
10140 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
10150 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
10160 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61  ..    if (certNa
10170 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
10180 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
10190 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
101a0 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20   certNames);..  
101b0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
101c0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
101d0 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41  }..#else..if (CA
101e0 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  path != NULL) {.
101f0 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
10200 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69  X_load_verify_di
10210 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74  r(ctx, F2N(CApat
10220 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62  h, &ds))) {...ab
10230 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
10240 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
10250 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20  ee(&ds);..}..if 
10260 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  (CAfile != NULL)
10270 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c   {..    if (!SSL
10280 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
10290 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43  _file(ctx, F2N(C
102a0 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a  Afile, &ds))) {.
102b0 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20  ..abort++;..    
102c0 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
102d0 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20  ngFree(&ds);... 
102e0 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f     /* Set list o
102f0 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f  f CAs to send to
10300 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71   client when req
10310 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74  uesting a client
10320 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
10330 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
10340 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
10350 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
10360 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
10370 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
10380 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61  ..    if (certNa
10390 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
103a0 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
103b0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
103c0 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20   certNames);..  
103d0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
103e0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
103f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
10400 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a      return ctx;.
10410 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
10420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
10460 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20   * StatusObjCmd 
10470 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66  -- return certif
10480 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63  icate for connec
10490 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20  ted peer.. *. * 
104a0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
104b0 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
104c0 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
104d0 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
104e0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
104f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10520 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
10530 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62  tic int.StatusOb
10540 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
10550 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
10560 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
10570 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
10580 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
10590 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
105a0 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39  atePtr;.    X509
105b0 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f   *peer;.    Tcl_
105c0 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20  Obj *objPtr;.   
105d0 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
105e0 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61  n;.    char *cha
105f0 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65  nnelName, *ciphe
10600 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65  rs;.    int mode
10610 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
10620 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
10630 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
10640 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  nt len;.    int 
10650 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76  nid, res;.    (v
10660 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
10670 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
10680 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
10690 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62   (objc < 2 || ob
106a0 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20  jc > 3 || (objc 
106b0 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28  == 3 && !strcmp(
106c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
106d0 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22  jv[1]), "-local"
106e0 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67  ))) {..Tcl_Wrong
106f0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10700 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61  1, objv, "?-loca
10710 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  l? channel");..r
10720 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10730 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
10740 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f  et channel Id */
10750 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  .    channelName
10760 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
10770 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32  (objv[(objc == 2
10780 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20   ? 1 : 2)]);.   
10790 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
107a0 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
107b0 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64  hannelName, &mod
107c0 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
107d0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
107e0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
107f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10800 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
10810 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
10820 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
10830 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
10840 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
10850 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
10860 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
10870 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
10880 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
10890 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
108a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
108b0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
108c0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
108d0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
108e0 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
108f0 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
10900 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
10910 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
10920 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53  , "TLS", "STATUS
10930 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
10940 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
10950 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
10960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10970 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
10980 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47   (State *) Tcl_G
10990 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
109a0 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
109b0 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69    /* Get certifi
109c0 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72  cate for peer or
109d0 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20   self */.    if 
109e0 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70  (objc == 2) {..p
109f0 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  eer = SSL_get_pe
10a00 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73  er_certificate(s
10a10 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
10a20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65     } else {..pee
10a30 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74  r = SSL_get_cert
10a40 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
10a50 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ssl);.    }.  
10a60 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65    /* Get X509 ce
10a70 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a  rtificate info *
10a80 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20  /.    if (peer) 
10a90 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f  {..objPtr = Tls_
10aa0 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
10ab0 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f  p, peer);..if (o
10ac0 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20  bjc == 2) {..   
10ad0 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29   X509_free(peer)
10ae0 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55  ;..    peer = NU
10af0 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
10b00 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63  e {..objPtr = Tc
10b10 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
10b20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  NULL);.    }..  
10b30 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a    /* Peer name *
10b40 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  /.    LAPPEND_ST
10b50 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10b60 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53  , "peername", SS
10b70 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28  L_get0_peername(
10b80 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
10b90 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  -1);.    LAPPEND
10ba0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
10bb0 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53  Ptr, "sbits", SS
10bc0 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74  L_get_cipher_bit
10bd0 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  s(statePtr->ssl,
10be0 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69   NULL));..    ci
10bf0 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53  phers = (char*)S
10c00 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74  SL_get_cipher(st
10c10 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
10c20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10c30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
10c40 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c  ipher", ciphers,
10c50 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65   -1);..    /* Ve
10c60 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65  rify the X509 ce
10c70 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e  rtificate presen
10c80 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20  ted by the peer 
10c90 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
10ca0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10cb0 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c 74  r, "verifyResult
10cc0 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f  ",..X509_verify_
10cd0 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
10ce0 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  g(SSL_get_verify
10cf0 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
10d00 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20  ->ssl)), -1);.. 
10d10 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64     /* Verify mod
10d20 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20  e */.    mode = 
10d30 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d  SSL_get_verify_m
10d40 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ode(statePtr->ss
10d50 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65  l);.    if (mode
10d60 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e   && SSL_VERIFY_N
10d70 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f  ONE) {..LAPPEND_
10d80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10d90 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22  tr, "verifyMode"
10da0 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20  , "none", -1);. 
10db0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
10dc0 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72  _Obj *listObjPtr
10dd0 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
10de0 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  j(0, NULL);..if 
10df0 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10e00 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20  IFY_PEER) {..   
10e10 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10e20 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10e30 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10e40 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10e50 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  peer", -1));..}.
10e60 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
10e70 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
10e80 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
10e90 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10ea0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10eb0 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10ec0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10ed0 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70  bj("fail if no p
10ee0 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b  eer cert", -1));
10ef0 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
10f00 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45   SSL_VERIFY_CLIE
10f10 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20  NT_ONCE) {..    
10f20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
10f30 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
10f40 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
10f50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
10f60 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29  lient once", -1)
10f70 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20  );..}..if (mode 
10f80 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f  && SSL_VERIFY_PO
10f90 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a  ST_HANDSHAKE) {.
10fa0 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10fb0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10fc0 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10fd0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10fe0 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61  bj("post handsha
10ff0 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c  ke", -1));..}..L
11000 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
11010 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
11020 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a  fyMode", listObj
11030 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Ptr).    }..    
11040 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64  /* Verify mode d
11050 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50  epth */.    LAPP
11060 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
11070 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44  objPtr, "verifyD
11080 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76  epth", SSL_get_v
11090 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74  erify_depth(stat
110a0 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20  ePtr->ssl));..  
110b0 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20    /* Report the 
110c0 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
110d0 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
110e0 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e   the negotiation
110f0 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30   */.    SSL_get0
11100 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
11110 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70  tatePtr->ssl, &p
11120 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  roto, &len);.   
11130 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11140 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c  erp, objPtr, "al
11150 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f  pn", (char *)pro
11160 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  to, (Tcl_Size) l
11170 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  en);.    LAPPEND
11180 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11190 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  Ptr, "protocol",
111a0 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e   SSL_get_version
111b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
111c0 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61   -1);..    /* Va
111d0 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20  lid for non-RSA 
111e0 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c  signature and TL
111f0 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20  S 1.3 */.    if 
11200 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72  (objc == 2) {..r
11210 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  es = SSL_get_pee
11220 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  r_signature_nid(
11230 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
11240 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  nid);.    } else
11250 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
11260 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  t_signature_nid(
11270 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
11280 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nid);.    }.    
11290 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d  if (!res) {nid =
112a0 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44   0;}.    LAPPEND
112b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
112c0 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48  Ptr, "signatureH
112d0 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f  ashAlgorithm", O
112e0 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20  BJ_nid2ln(nid), 
112f0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  -1);..    /* Add
11300 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e  ed in OpenSSL 1.
11310 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  1.1a */.#if OPEN
11320 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
11330 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c  ER > 0x10101000L
11340 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
11350 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
11360 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
11370 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61  ure_type_nid(sta
11380 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
11390 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
113a0 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73  .res = SSL_get_s
113b0 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69  ignature_type_ni
113c0 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
113d0 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20   &nid);.    }.  
113e0 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64    if (!res) {nid
113f0 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45   = 0;}.    LAPPE
11400 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11410 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72  bjPtr, "signatur
11420 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32  eType", OBJ_nid2
11430 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65  ln(nid), -1);.#e
11440 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65  ndif..    Tcl_Se
11450 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11460 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
11470 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11480 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
114d0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  * ConnectionInfo
114e0 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
114f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
11500 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
11510 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
11520 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65  .A list of conne
11530 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20  ction info.  *. 
11540 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11580 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
11590 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49   int ConnectionI
115a0 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nfoObjCmd(Client
115b0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
115c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
115d0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
115e0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
115f0 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
11600 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
11610 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
11620 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a   set a mode on *
11630 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
11640 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
11650 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
11660 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
11670 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
11680 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
11690 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
116a0 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
116b0 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
116c0 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
116d0 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
116e0 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b  onst EVP_MD *md;
116f0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
11700 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20  ntData;..    if 
11710 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
11720 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11730 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11740 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
11750 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11760 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
11770 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
11780 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11790 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
117a0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
117b0 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
117c0 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
117d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
117e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
117f0 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
11800 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
11810 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
11820 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
11830 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
11840 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
11850 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
11860 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
11870 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
11880 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11890 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
118a0 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
118b0 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
118c0 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61  ..    "\": not a
118d0 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
118e0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
118f0 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
11900 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
11910 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43  "CONNECTION", "C
11920 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
11930 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
11940 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
11950 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
11960 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
11970 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
11980 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
11990 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
119a0 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
119b0 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
119c0 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
119d0 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
119e0 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
119f0 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
11a00 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e   NULL) {../* con
11a10 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f  nection state */
11a20 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11a30 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11a40 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65  tate", SSL_state
11a50 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
11a60 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
11a70 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73   SNI requested s
11a80 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c  erver name */..L
11a90 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11aa0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76  p, objPtr, "serv
11ab0 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74  ername", SSL_get
11ac0 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
11ad0 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
11ae0 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29  _host_name), -1)
11af0 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
11b00 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  col */..LAPPEND_
11b10 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11b20 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
11b30 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
11b40 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
11b50 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
11b60 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e  lowed */..LAPPEN
11b70 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11b80 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69  bjPtr, "renegoti
11b90 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20  ation_allowed", 
11ba0 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72  SSL_get_secure_r
11bb0 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70  enegotiation_sup
11bc0 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c  port((SSL *) ssl
11bd0 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63  ));.../* Get sec
11be0 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09  urity level */..
11bf0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11c00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63  rp, objPtr, "sec
11c10 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53  urity_level", SS
11c20 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  L_get_security_l
11c30 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  evel(ssl));.../*
11c40 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f   Session info */
11c50 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
11c60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11c70 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c  session_reused",
11c80 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75   SSL_session_reu
11c90 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  sed(ssl));.../* 
11ca0 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a  Is server info *
11cb0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11cc0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11cd0 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c  "is_server", SSL
11ce0 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29  _is_server(ssl))
11cf0 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a  ;.../* Is DTLS *
11d00 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11d10 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11d20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69  "is_dtls", SSL_i
11d30 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20  s_dtls(ssl));.  
11d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68    }..    /* Ciph
11d50 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63  er info */.    c
11d60 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  ipher = SSL_get_
11d70 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73  current_cipher(s
11d80 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70  sl);.    if (cip
11d90 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  her != NULL) {..
11da0 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
11db0 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74   = {0};..int bit
11dc0 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f  s, alg_bits;.../
11dd0 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f  * Cipher name */
11de0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11df0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11e00 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48  ipher", SSL_CIPH
11e10 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68  ER_get_name(ciph
11e20 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52  er), -1);.../* R
11e30 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65  FC name of ciphe
11e40 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
11e50 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11e60 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  , "standard_name
11e70 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74  ", SSL_CIPHER_st
11e80 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68  andard_name(ciph
11e90 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f  er), -1);.../* O
11ea0 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63  penSSL name of c
11eb0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
11ec0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11ed0 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e  jPtr, "openssl_n
11ee0 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69  ame", OPENSSL_ci
11ef0 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49  pher_name(SSL_CI
11f00 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
11f10 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  me(cipher)), -1)
11f20 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66  ;.../* number of
11f30 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65   secret bits use
11f40 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a  d for cipher */.
11f50 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48  .bits = SSL_CIPH
11f60 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68  ER_get_bits(ciph
11f70 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a  er, &alg_bits);.
11f80 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
11f90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11fa0 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73  cret_bits", bits
11fb0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  );..LAPPEND_INT(
11fc0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11fd0 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22  "algorithm_bits"
11fe0 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a  , alg_bits);../*
11ff0 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74   alg_bits is act
12000 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62  ual key secret b
12010 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73  its. If use bits
12020 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67   and secret (alg
12030 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66  orithm) bits dif
12040 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73  fer,..   the res
12050 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72  t of the bits ar
12060 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f  e fixed, i.e. fo
12070 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74  r limited export
12080 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c   ciphers (bits <
12090 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64   56) */.../* Ind
120a0 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c  icates which SSL
120b0 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65  /TLS protocol ve
120c0 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69  rsion first defi
120d0 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a  ned the cipher *
120e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
120f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12100 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53  min_version", SS
12110 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72  L_CIPHER_get_ver
12120 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31  sion(cipher), -1
12130 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e  );.../* Cipher N
12140 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  ID */..LAPPEND_S
12150 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12160 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20  r, "cipherNID", 
12170 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
12180 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
12190 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70  t_cipher_nid(cip
121a0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
121b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
121c0 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74   objPtr, "digest
121d0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
121e0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
121f0 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e  HER_get_digest_n
12200 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  id(cipher)), -1)
12210 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
12220 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12230 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c  keyExchangeNID",
12240 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
12250 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
12260 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72  et_kx_nid(cipher
12270 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
12280 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12290 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63  jPtr, "authentic
122a0 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72  ationNID", (char
122b0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
122c0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74  L_CIPHER_get_aut
122d0 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  h_nid(cipher)), 
122e0 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67  -1);.../* messag
122f0 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
12300 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69   code - Cipher i
12310 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d  s AEAD (e.g. GCM
12320 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c   or ChaCha20/Pol
12330 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f  y1305) or not */
12340 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74  ../* Authenticat
12350 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69  ed Encryption wi
12360 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  th associated da
12370 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20  ta (AEAD) check 
12380 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
12390 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
123a0 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64   "cipher_is_aead
123b0 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73  ", SSL_CIPHER_is
123c0 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a  _aead(cipher));.
123d0 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64  ../* Digest used
123e0 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f   during the SSL/
123f0 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68  TLS handshake wh
12400 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70  en using the cip
12410 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53  her. */..md = SS
12420 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e  L_CIPHER_get_han
12430 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69  dshake_digest(ci
12440 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  pher);..LAPPEND_
12450 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12460 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64  tr, "handshake_d
12470 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29  igest", (char *)
12480 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c  EVP_MD_name(md),
12490 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f   -1);.../* Get O
124a0 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20  penSSL-specific 
124b0 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20  ID, not IANA ID 
124c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  */..LAPPEND_INT(
124d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
124e0 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e  "cipher_id", (in
124f0 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  t) SSL_CIPHER_ge
12500 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a  t_id(cipher));..
12510 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20  ./* Two-byte ID 
12520 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20  used in the TLS 
12530 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20  protocol of the 
12540 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a  given cipher */.
12550 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
12560 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
12570 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74  otocol_id", (int
12580 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  ) SSL_CIPHER_get
12590 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70  _protocol_id(cip
125a0 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74  her));.../* Text
125b0 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
125c0 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
125d0 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52  ..if (SSL_CIPHER
125e0 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70  _description(cip
125f0 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  her, buf, sizeof
12600 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (buf)) != NULL) 
12610 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  {..    LAPPEND_S
12620 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12630 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22  r, "description"
12640 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20  , buf, -1);..}. 
12650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73     }..    /* Ses
12660 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
12670 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67   session = SSL_g
12680 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b  et_session(ssl);
12690 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e  .    if (session
126a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e   != NULL) {..con
126b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
126c0 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f   *ticket;..size_
126d0 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65  t len2;..unsigne
126e0 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e  d int ulen;..con
126f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12700 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70   *session_id, *p
12710 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20  roto;..unsigned 
12720 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f  char buffer[SSL_
12730 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
12740 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70  ENGTH];.../* Rep
12750 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
12760 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
12770 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50  esult of the ALP
12780 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
12790 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
127a0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
127b0 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f  (session, &proto
127c0 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45  , &len2);..LAPPE
127d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
127e0 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28  bjPtr, "alpn", (
127f0 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28  char *) proto, (
12800 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
12810 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
12820 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
12830 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
12840 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69  f the NPN negoti
12850 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20  ation */.#ifdef 
12860 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74  USE_NPN..SSL_get
12870 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67  0_next_proto_neg
12880 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72  otiated(ssl, &pr
12890 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  oto, &ulen);..LA
128a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
128b0 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c  , objPtr, "npn",
128c0 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c   (char *) proto,
128d0 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e   (Tcl_Size) ulen
128e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52  );.#endif.../* R
128f0 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e  esumable session
12900 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
12910 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
12920 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53  , "resumable", S
12930 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65  SL_SESSION_is_re
12940 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29  sumable(session)
12950 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12960 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f  start time (seco
12970 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29  nds since epoch)
12980 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
12990 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
129a0 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20  , "start_time", 
129b0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
129c0 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a  time(session));.
129d0 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c  ../* Timeout val
129e0 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74  ue - SSL_CTX_get
129f0 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63  _timeout (in sec
12a00 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e  onds) */..LAPPEN
12a10 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f  D_LONG(interp, o
12a20 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22  bjPtr, "timeout"
12a30 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  , SSL_SESSION_ge
12a40 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f  t_timeout(sessio
12a50 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
12a60 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61  n id - TLSv1.2 a
12a70 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f  nd below only */
12a80 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53  ..session_id = S
12a90 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69  SL_SESSION_get_i
12aa0 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  d(session, &ulen
12ab0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
12ac0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
12ad0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c  r, "session_id",
12ae0 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63   session_id, (Tc
12af0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a  l_Size) ulen);..
12b00 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74  ./* Session cont
12b10 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f  ext */..session_
12b20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
12b30 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74  _get0_id_context
12b40 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29  (session, &ulen)
12b50 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
12b60 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
12b70 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65  , "session_conte
12b80 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  xt", session_id,
12b90 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e   (Tcl_Size) ulen
12ba0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12bb0 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20  ticket - client 
12bc0 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  only */..SSL_SES
12bd0 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
12be0 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
12bf0 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  t, &len2);..LAPP
12c00 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12c10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
12c20 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63  ion_ticket", tic
12c30 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ket, (Tcl_Size) 
12c40 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  len2);.../* Sess
12c50 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74  ion ticket lifet
12c60 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63  ime hint (in sec
12c70 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e  onds) */..LAPPEN
12c80 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f  D_LONG(interp, o
12c90 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65  bjPtr, "lifetime
12ca0 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
12cb0 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69  et_ticket_lifeti
12cc0 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29  me_hint(session)
12cd0 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61  );.../* Ticket a
12ce0 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f  pp data */.#if O
12cf0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
12d00 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
12d10 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e  00L..SSL_SESSION
12d20 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70  _get0_ticket_app
12d30 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f  data((SSL_SESSIO
12d40 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74  N *) session, &t
12d50 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09  icket, &len2);..
12d60 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
12d70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12d80 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22  ticket_app_data"
12d90 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53  , ticket, (Tcl_S
12da0 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64  ize) len2);.#end
12db0 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74  if.../* Get mast
12dc0 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20  er key */..len2 
12dd0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
12de0 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73  t_master_key(ses
12df0 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53  sion, buffer, SS
12e00 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
12e10 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45  _LENGTH);..LAPPE
12e20 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
12e30 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65  , objPtr, "maste
12e40 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20  r_key", buffer, 
12e50 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
12e60 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69  ;.../* Compressi
12e70 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e  on id */..unsign
12e80 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f  ed int id = SSL_
12e90 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70  SESSION_get_comp
12ea0 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29  ress_id(session)
12eb0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
12ec0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12ed0 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c  compression_id",
12ee0 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62   id == 1 ? "zlib
12ef0 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  " : "none", -1);
12f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
12f10 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20  ompression info 
12f20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  */.    if (ssl !
12f30 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66  = NULL) {.#ifdef
12f40 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45   HAVE_SSL_COMPRE
12f50 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d  SSION..const COM
12f60 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20  P_METHOD *comp, 
12f70 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53  *expn;..comp = S
12f80 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
12f90 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b  ompression(ssl);
12fa0 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74  ..expn = SSL_get
12fb0 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69  _current_expansi
12fc0 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45  on(ssl);...LAPPE
12fd0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
12fe0 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73  bjPtr, "compress
12ff0 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c  ion", comp ? SSL
13000 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63  _COMP_get_name(c
13010 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d  omp) : "none", -
13020 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
13030 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13040 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78   "expansion", ex
13050 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65  pn ? SSL_COMP_ge
13060 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22  t_name(expn) : "
13070 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73  none", -1);.#els
13080 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  e..LAPPEND_STR(i
13090 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
130a0 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e  compression", "n
130b0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
130c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
130d0 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
130e0 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
130f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
13100 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e      /* Server in
13110 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e  fo */.    {..lon
13120 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58  g mode = SSL_CTX
13130 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _get_session_cac
13140 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
13150 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d  ->ctx);..char *m
13160 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26  sg;...if (mode &
13170 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
13180 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  OFF) {..    msg 
13190 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65  = "off";..} else
131a0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
131b0 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
131c0 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  T) {..    msg = 
131d0 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73  "client";..} els
131e0 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
131f0 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56  _SESS_CACHE_SERV
13200 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  ER) {..    msg =
13210 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c   "server";..} el
13220 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
13230 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54  L_SESS_CACHE_BOT
13240 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  H) {..    msg = 
13250 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20  "both";..} else 
13260 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e  {..    msg = "un
13270 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50  known";..}..LAPP
13280 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13290 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
132a0 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73  _cache_mode", ms
132b0 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  g, -1);.    }.. 
132c0 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f     /* CA List */
132d0 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61  .    /* IF not a
132e0 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73   server, same as
132f0 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43   SSL_get0_peer_C
13300 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65  A_list. If serve
13310 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54  r same as SSL_CT
13320 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_get_client_CA_
13330 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74  list */.    list
13340 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
13350 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
13360 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39     STACK_OF(X509
13370 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b  _NAME) *ca_list;
13380 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73  .    if ((ca_lis
13390 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65  t = SSL_get_clie
133a0 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29  nt_CA_list(ssl))
133b0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61   != NULL) {..cha
133c0 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d  r buffer[BUFSIZ]
133d0 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20  ;..for (int i = 
133e0 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e  0; i < sk_X509_N
133f0 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29  AME_num(ca_list)
13400 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35  ; i++) {..    X5
13410 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20  09_NAME *name = 
13420 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c  sk_X509_NAME_val
13430 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a  ue(ca_list, i);.
13440 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b  .    if (name) {
13450 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65  ...X509_NAME_one
13460 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65  line(name, buffe
13470 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63  r, BUFSIZ);...Tc
13480 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
13490 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
134a0 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  istPtr, Tcl_NewS
134b0 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c  tringObj(buffer,
134c0 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d   -1));..    }..}
134d0 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45  .    }.    LAPPE
134e0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
134f0 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c  bjPtr, "caList",
13500 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c   listPtr);.    L
13510 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
13520 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69  p, objPtr, "caLi
13530 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30  stCount", sk_X50
13540 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69  9_NAME_num(ca_li
13550 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  st));..    Tcl_S
13560 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
13570 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
13580 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
13590 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
135e0 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64   * VersionObjCmd
135f0 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69   -- return versi
13600 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f  on string from O
13610 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
13620 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
13630 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
13640 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
13650 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
13660 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136a0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
136b0 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a  c int.VersionObj
136c0 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
136d0 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
136e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
136f0 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
13700 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
13710 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
13720 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64  bjPtr;.    (void
13730 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ) clientData;.  
13740 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20    (void) objc;. 
13750 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a     (void) objv;.
13760 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13770 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a  lled");..    obj
13780 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Ptr = Tcl_NewStr
13790 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56  ingObj(OPENSSL_V
137a0 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29  ERSION_TEXT, -1)
137b0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
137c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
137d0 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74  bjPtr);..    ret
137e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
137f0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d  --------. *. * M
13840 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73  iscObjCmd -- mis
13850 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  c commands. *. *
13860 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
13870 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
13880 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
13890 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
138a0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
138b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
138f0 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a  atic int.MiscObj
13900 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
13910 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
13920 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
13930 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
13940 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
13950 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
13960 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64  st char *command
13970 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20  s [] = { "req", 
13980 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d  "strreq", NULL }
13990 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61  ;.    enum comma
139a0 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54  nd { C_REQ, C_ST
139b0 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b  RREQ, C_DUMMY };
139c0 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d  .    Tcl_Size cm
139d0 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72  d;.    int isStr
139e0 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65  ;.    char buffe
139f0 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76  r[16384];.    (v
13a00 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
13a10 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
13a20 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
13a30 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
13a40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13a50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
13a60 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72   "subcommand ?ar
13a70 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  gs?");..return T
13a80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13a90 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
13aa0 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
13ab0 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d  rp, objv[1], com
13ac0 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22  mands, "command"
13ad0 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43  , 0, &cmd) != TC
13ae0 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
13af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13b00 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
13b10 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73  error();..    is
13b20 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f  Str = (cmd == C_
13b30 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69  STRREQ);.    swi
13b40 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61  tch ((enum comma
13b50 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65  nd) cmd) {..case
13b60 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f   C_REQ:..case C_
13b70 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45  STRREQ: {..    E
13b80 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55  VP_PKEY *pkey=NU
13b90 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63  LL;..    X509 *c
13ba0 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58  ert=NULL;..    X
13bb0 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e  509_NAME *name=N
13bc0 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62  ULL;..    Tcl_Ob
13bd0 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20  j **listv;..    
13be0 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a  Tcl_Size listc;.
13bf0 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20  .    int i;...  
13c00 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b    BIO *out=NULL;
13c10 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43  ...    char *k_C
13c20 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f  ="",*k_ST="",*k_
13c30 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f  L="",*k_O="",*k_
13c40 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a  OU="",*k_CN="",*
13c50 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20  k_Email="";..   
13c60 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70   char *keyout,*p
13c70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20  emout,*str;..   
13c80 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72   int keysize,ser
13c90 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a  ial=0,days=365;.
13ca0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
13cb0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
13cc0 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42  30000000L..    B
13cd0 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c  IGNUM *bne = NUL
13ce0 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61  L;..    RSA *rsa
13cf0 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09   = NULL;.#else..
13d00 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58      EVP_PKEY_CTX
13d10 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65   *ctx = NULL;.#e
13d20 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28  ndif...    if ((
13d30 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63  objc<5) || (objc
13d40 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f  >6)) {...Tcl_Wro
13d50 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13d60 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73  , 2, objv, "keys
13d70 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74  ize keyfile cert
13d80 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09  file ?info?");..
13d90 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13da0 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  R;..    }...    
13db0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
13dc0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13dd0 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29  jv[2], &keysize)
13de0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
13df0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e00 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65  ;..    }..    ke
13e10 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  yout=Tcl_GetStri
13e20 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20  ng(objv[3]);..  
13e30 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74    pemout=Tcl_Get
13e40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
13e50 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29  ..    if (isStr)
13e60 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28   {...Tcl_SetVar(
13e70 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22  interp,keyout,""
13e80 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61  ,0);...Tcl_SetVa
13e90 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
13ea0 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  "",0);..    }...
13eb0 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29      if (objc>=6)
13ec0 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73   {...if (Tcl_Lis
13ed0 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
13ee0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c  interp, objv[5],
13ef0 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29   &listc, &listv)
13f00 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
13f10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13f20 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
13f30 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29  ((listc%2) != 0)
13f40 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
13f50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49  Result(interp,"I
13f60 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20  nformation list 
13f70 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e  must have even n
13f80 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
13f90 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ts",NULL);...   
13fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13fb0 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d  R;...}...for (i=
13fc0 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32  0; i<listc; i+=2
13fd0 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63  ) {...    str=Tc
13fe0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13ff0 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20  v[i]);...    if 
14000 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79  (strcmp(str,"day
14010 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20  s")==0) {....if 
14020 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
14030 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b  bj(interp,listv[
14040 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c  i+1],&days)!=TCL
14050 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
14060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
14070 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
14080 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61  trcmp(str,"seria
14090 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20  l")==0) {....if 
140a0 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
140b0 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b  bj(interp,listv[
140c0 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54  i+1],&serial)!=T
140d0 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
140e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
140f0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
14100 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29  (strcmp(str,"C")
14110 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63  ==0) {....k_C=Tc
14120 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
14130 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
14140 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
14150 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b  (str,"ST")==0) {
14160 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74  ....k_ST=Tcl_Get
14170 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14180 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14190 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
141a0 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "L")==0) {....k_
141b0 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  L=Tcl_GetString(
141c0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
141d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
141e0 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30  rcmp(str,"O")==0
141f0 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47  ) {....k_O=Tcl_G
14200 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
14210 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
14220 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
14230 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"OU")==0) {...
14240 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72  .k_OU=Tcl_GetStr
14250 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
14260 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
14270 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e   (strcmp(str,"CN
14280 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e  ")==0) {....k_CN
14290 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
142a0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
142b0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
142c0 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29  cmp(str,"Email")
142d0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69  ==0) {....k_Emai
142e0 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  l=Tcl_GetString(
142f0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
14300 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54     } else {....T
14310 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14320 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72  erp,"Unknown par
14330 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09  ameter",NULL);..
14340 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
14350 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a  OR;...    }...}.
14360 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e  .    }..#if OPEN
14370 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
14380 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
14390 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e  ..    bne = BN_n
143a0 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d  ew();..    rsa =
143b0 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20   RSA_new();..   
143c0 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59   pkey = EVP_PKEY
143d0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20  _new();..    if 
143e0 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (bne == NULL || 
143f0 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70  rsa == NULL || p
14400 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  key == NULL || !
14410 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c  BN_set_word(bne,
14420 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53  RSA_F4) ||...!RS
14430 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65  A_generate_key_e
14440 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20  x(rsa, keysize, 
14450 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45  bne, NULL) || !E
14460 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52  VP_PKEY_assign_R
14470 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b  SA(pkey, rsa)) {
14480 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
14490 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41  (pkey);.../* RSA
144a0 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65  _free(rsa); free
144b0 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72  d by EVP_PKEY_fr
144c0 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28  ee */...BN_free(
144d0 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20  bne);.#else..   
144e0 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f   pkey = EVP_RSA_
144f0 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  gen((unsigned in
14500 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20  t) keysize);..  
14510 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59    ctx = EVP_PKEY
14520 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55  _CTX_new(pkey,NU
14530 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b  LL);..    if (pk
14540 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74  ey == NULL || ct
14550 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56  x == NULL || !EV
14560 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e  P_PKEY_keygen_in
14570 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56  it(ctx) ||...!EV
14580 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72  P_PKEY_CTX_set_r
14590 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63  sa_keygen_bits(c
145a0 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20  tx, keysize) || 
145b0 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e  !EVP_PKEY_keygen
145c0 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a  (ctx, &pkey)) {.
145d0 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
145e0 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45  pkey);...EVP_PKE
145f0 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  Y_CTX_free(ctx);
14600 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65  .#endif...Tcl_Se
14610 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
14620 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  Error generating
14630 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55   private key",NU
14640 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
14650 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20  L_ERROR;..    } 
14660 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53  else {...if (isS
14670 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
14680 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
14690 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
146a0 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74  write_bio_Privat
146b0 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55  eKey(out,pkey,NU
146c0 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e  LL,NULL,0,NULL,N
146d0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ULL);...    i=BI
146e0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
146f0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
14700 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
14710 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
14720 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
14730 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
14740 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74  ar(interp,keyout
14750 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
14760 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
14770 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
14780 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
14790 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
147a0 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
147b0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
147c0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
147d0 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  keyout);...    P
147e0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69  EM_write_bio_Pri
147f0 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79  vateKey(out,pkey
14800 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c  ,NULL,NULL,0,NUL
14810 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f  L,NULL);...    /
14820 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f  * PEM_write_bio_
14830 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75  RSAPrivateKey(ou
14840 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55  t, rsa, NULL, NU
14850 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  LL, 0, NULL, NUL
14860 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f  L); */...    BIO
14870 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a  _free_all(out);.
14880 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72  . .}....if ((cer
14890 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e  t=X509_new())==N
148a0 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
148b0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
148c0 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74  p,"Error generat
148d0 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20  ing certificate 
148e0 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a  request",NULL);.
148f0 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
14900 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
14910 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
14920 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
14930 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65  00L...    BN_fre
14940 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
14950 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14960 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35  ERROR;...}....X5
14970 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63  09_set_version(c
14980 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49  ert,2);...ASN1_I
14990 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f  NTEGER_set(X509_
149a0 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72  get_serialNumber
149b0 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a  (cert),serial);.
149c0 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64  ..X509_gmtime_ad
149d0 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42  j(X509_getm_notB
149e0 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a  efore(cert),0);.
149f0 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64  ..X509_gmtime_ad
14a00 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41  j(X509_getm_notA
14a10 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67  fter(cert),(long
14a20 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b  )60*60*24*days);
14a30 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b  ...X509_set_pubk
14a40 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a  ey(cert,pkey);..
14a50 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f  ..name=X509_get_
14a60 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
14a70 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45  t);....X509_NAME
14a80 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
14a90 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54  t(name,"C", MBST
14aa0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14ab0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14ac0 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_C, -1, -1, 0
14ad0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
14ae0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14af0 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52  name,"ST", MBSTR
14b00 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14b10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14b20 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30   k_ST, -1, -1, 0
14b30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
14b40 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14b50 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49  name,"L", MBSTRI
14b60 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14b70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14b80 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_L, -1, -1, 0);
14b90 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14ba0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14bb0 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47  me,"O", MBSTRING
14bc0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
14bd0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
14be0 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  O, -1, -1, 0);..
14bf0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14c00 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14c10 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"OU", MBSTRING_
14c20 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14c30 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f  gned char *) k_O
14c40 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  U, -1, -1, 0);..
14c50 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14c60 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14c70 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"CN", MBSTRING_
14c80 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14c90 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
14ca0 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  N, -1, -1, 0);..
14cb0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14cc0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14cd0 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49  ,"Email", MBSTRI
14ce0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14cf0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14d00 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c  k_Email, -1, -1,
14d10 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74   0);....X509_set
14d20 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
14d30 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20  rt,name);....if 
14d40 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74  (!X509_sign(cert
14d50 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36  ,pkey,EVP_sha256
14d60 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30  ())) {...    X50
14d70 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
14d80 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
14d90 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
14da0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
14db0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
14dc0 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
14dd0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
14de0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
14df0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73  (interp,"Error s
14e00 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61  igning certifica
14e10 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  te",NULL);...   
14e20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14e30 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73  R;...}....if (is
14e40 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
14e50 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
14e60 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
14e70 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28  _write_bio_X509(
14e80 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20  out,cert);...   
14e90 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c   i=BIO_read(out,
14ea0 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75  buffer,sizeof(bu
14eb0 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20  ffer)-1);...    
14ec0 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b  i=(i<0) ? 0 : i;
14ed0 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d  ...    buffer[i]
14ee0 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c  ='\0';...    Tcl
14ef0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70  _SetVar(interp,p
14f00 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b  emout,buffer,0);
14f10 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68  ...    BIO_flush
14f20 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  (out);...    BIO
14f30 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20  _free(out);...} 
14f40 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74  else {...    out
14f50 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66  =BIO_new(BIO_s_f
14f60 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49  ile());...    BI
14f70 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65  O_write_filename
14f80 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09  (out,pemout);...
14f90 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
14fa0 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29  o_X509(out,cert)
14fb0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
14fc0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a  _all(out);...}..
14fd0 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74  ..X509_free(cert
14fe0 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72  );...EVP_PKEY_fr
14ff0 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
15000 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
15010 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
15020 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65  0L...BN_free(bne
15030 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d  );.#endif..    }
15040 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  ..}..break;.    
15050 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b  default:..break;
15060 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
15070 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
15080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15090 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20  ***/./* Init    
150a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
150b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150c0 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
15110 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20   * Tls_Free --. 
15120 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
15130 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68  ure cleans up wh
15140 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  en a SSL socket 
15150 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a  based channel. *
15160 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69  .is closed and i
15170 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
15180 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31  nt falls below 1
15190 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
151a0 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.none. *. * Si
151b0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46  de effects:. *.F
151c0 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61  rees all the sta
151d0 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  te. *. *--------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
15220 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c  void.Tls_Free(tl
15230 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f  s_free_type *blo
15240 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61  ckPtr) {.    Sta
15250 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
15260 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72  State *)blockPtr
15270 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
15280 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54  Called");..    T
15290 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74  ls_Clean(statePt
152a0 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62  r);.    ckfree(b
152b0 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  lockPtr);.}.../*
152c0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15300 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
15310 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09  _Clean --. *. *.
15320 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
15330 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
15340 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
15350 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
15360 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
15370 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
15380 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68  lls below 1.  Th
15390 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20  is should. *.be 
153a0 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f  called synchrono
153b0 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73  usly by the Clos
153c0 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68  eProc, not in th
153d0 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46  e. *.EventuallyF
153e0 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  ree callback.. *
153f0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
15400 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
15410 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
15420 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
15430 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15470 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
15480 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74  d Tls_Clean(Stat
15490 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20  e *statePtr) {. 
154a0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
154b0 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ed");..    /*.  
154c0 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d     * we're assum
154d0 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65  ing here that we
154e0 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61  're single-threa
154f0 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ded.     */.    
15500 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
15510 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
15520 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
15530 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
15540 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
15550 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
15560 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c  Ptr->timer = NUL
15570 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
15580 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
15590 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74  os) {..ckfree(st
155a0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b  atePtr->protos);
155b0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
155c0 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  os = NULL;.    }
155d0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
155e0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68  r->bio) {../* Th
155f0 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c  is will call SSL
15600 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31  _shutdown. Bug 1
15610 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e  414045 */..dprin
15620 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  tf("BIO_free_all
15630 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
15640 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  >bio);..BIO_free
15650 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _all(statePtr->b
15660 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  io);..statePtr->
15670 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bio = NULL;.    
15680 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15690 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69  tr->ssl) {..dpri
156a0 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70  ntf("SSL_free(%p
156b0 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  )", statePtr->ss
156c0 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74  l);..SSL_free(st
156d0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73  atePtr->ssl);..s
156e0 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e  tatePtr->ssl = N
156f0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
15700 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  f (statePtr->ctx
15710 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  ) {..SSL_CTX_fre
15720 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
15730 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ;..statePtr->ctx
15740 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
15750 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
15760 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63  >callback) {..Tc
15770 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
15780 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
15790 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  k);..statePtr->c
157a0 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  allback = NULL;.
157b0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
157c0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
157d0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
157e0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
157f0 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74  password);..stat
15800 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
15810 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
15820 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
15830 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  cmd) {..Tcl_Decr
15840 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
15850 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65  r->vcmd);..state
15860 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c  Ptr->vcmd = NULL
15870 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
15880 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
15890 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49  --. *. * Build I
158f0 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20  nfo Command --. 
15900 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d  *. *.Create comm
15910 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75  and to return bu
15920 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63  ild info for pac
15930 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  kage.. *. * Resu
15940 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
15950 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a  rd Tcl result. *
15960 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
15970 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69  :. *.Created bui
15980 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e  ld-info command.
15990 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
159e0 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47  ..#ifndef STRING
159f0 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54  IFY.#  define ST
15a00 52 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e  RINGIFY(x) STRIN
15a10 47 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69  GIFY1(x).#  defi
15a20 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29  ne STRINGIFY1(x)
15a30 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a   #x.#endif..int.
15a40 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64  BuildInfoCommand
15a50 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74  (Tcl_Interp* int
15a60 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  erp) {.    Tcl_C
15a70 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  mdInfo info;..  
15a80 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d    if (Tcl_GetCom
15a90 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
15aa0 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69   "::tcl::build-i
15ab0 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a  nfo", &info)) {.
15ac0 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f  .Tcl_CreateObjCo
15ad0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
15ae0 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f  :tls::build-info
15af0 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c  ", info.objProc,
15b00 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43   (void *)(...PAC
15b10 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22  KAGE_VERSION "+"
15b20 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56   STRINGIFY(TLS_V
15b30 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66  ERSION_UUID).#if
15b40 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67   defined(__clang
15b50 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  __) && defined(_
15b60 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a  _clang_major__).
15b70 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22  ...    ".clang-"
15b80 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61   STRINGIFY(__cla
15b90 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20  ng_major__).#if 
15ba0 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20  __clang_minor__ 
15bb0 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a  < 10....    "0".
15bc0 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54  #endif....    ST
15bd0 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f  RINGIFY(__clang_
15be0 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a  minor__).#endif.
15bf0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70  #if defined(__cp
15c00 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66  lusplus) && !def
15c10 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09  ined(__OBJC__)..
15c20 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75  ..    ".cplusplu
15c30 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  s".#endif.#ifnde
15c40 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20  f NDEBUG....    
15c50 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a  ".debug".#endif.
15c60 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63  #if !defined(__c
15c70 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69  lang__) && !defi
15c80 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50  ned(__INTEL_COMP
15c90 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64  ILER) && defined
15ca0 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20  (__GNUC__)....  
15cb0 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47    ".gcc-" STRING
15cc0 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69  IFY(__GNUC__).#i
15cd0 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f  f __GNUC_MINOR__
15ce0 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22   < 10....    "0"
15cf0 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53  .#endif....    S
15d00 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f  TRINGIFY(__GNUC_
15d10 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a  MINOR__).#endif.
15d20 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43  #ifdef __INTEL_C
15d30 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22  OMPILER....    "
15d40 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59  .icc-" STRINGIFY
15d50 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45  (__INTEL_COMPILE
15d60 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  R).#endif.#ifdef
15d70 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09   TCL_MEM_DEBUG..
15d80 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67  ..    ".memdebug
15d90 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ".#endif.#if def
15da0 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09  ined(_MSC_VER)..
15db0 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53  ..    ".msvc-" S
15dc0 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45  TRINGIFY(_MSC_VE
15dd0 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  R).#endif.#ifdef
15de0 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20   USE_NMAKE....  
15df0 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69    ".nmake".#endi
15e00 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46  f.#ifndef TCL_CF
15e10 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20  G_OPTIMIZED.... 
15e20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65     ".no-optimize
15e30 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
15e40 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20  __OBJC__....    
15e50 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23  ".objective-c".#
15e60 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c  if defined(__cpl
15e70 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22  usplus)....    "
15e80 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66  plusplus".#endif
15e90 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54  .#endif.#ifdef T
15ea0 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a  CL_CFG_PROFILED.
15eb0 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65  ...    ".profile
15ec0 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
15ed0 50 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e  PURIFY....    ".
15ee0 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23  purify".#endif.#
15ef0 69 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49  ifdef STATIC_BUI
15f00 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74  LD....    ".stat
15f10 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20  ic".#endif...), 
15f20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NULL);.    }.   
15f30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15f40 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
15f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
15f90 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20   * Tls_Init --. 
15fa0 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70  *. *.This is a p
15fb0 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a  ackage initializ
15fc0 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c  ation procedure,
15fd0 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64   which is called
15fe0 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20  . *.by Tcl when 
15ff0 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20  this package is 
16000 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  to be added to a
16010 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  n interpreter.. 
16020 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53  *. * Results:  S
16030 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e  sl configured an
16040 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53  d loaded. *. * S
16050 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
16060 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20   create the ssl 
16070 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c  command, initial
16080 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a  ize ssl context.
16090 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
160a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69  --------. */..#i
160e0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
160f0 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20  ION > 8.#define 
16100 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30  MIN_VERSION "9.0
16110 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ".#else.#define 
16120 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35  MIN_VERSION "8.5
16130 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ".#endif..static
16140 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
16150 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
16160 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
16170 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
16180 20 20 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20    };..DLLEXPORT 
16190 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c  int Tls_Init(Tcl
161a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
161b0 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
161c0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64  "Called");..#ifd
161d0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
161e0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69  .    if (Tcl_Ini
161f0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d  tStubs(interp, M
16200 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
16210 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
16220 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16230 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
16240 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65   (Tcl_PkgRequire
16250 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20  (interp, "Tcl", 
16260 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20  MIN_VERSION, 0) 
16270 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
16280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16290 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73    }..    if (Tls
162a0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
162b0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
162c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
162d0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69  , "could not ini
162e0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72  tialize SSL libr
162f0 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ary", (char *) N
16300 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
16310 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
16320 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
16330 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
16340 20 22 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73   "::tls::ciphers
16350 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
16360 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
16370 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
16380 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
16390 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
163a0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
163b0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65  p, "::tls::conne
163c0 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69  ction", Connecti
163d0 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43  onInfoObjCmd, (C
163e0 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
163f0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
16400 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
16410 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
16420 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
16430 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65  ::tls::handshake
16440 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43  ", HandshakeObjC
16450 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
16460 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
16470 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
16480 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
16490 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
164a0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70  erp, "::tls::imp
164b0 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43  ort", ImportObjC
164c0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
164d0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
164e0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
164f0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
16500 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
16510 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69  erp, "::tls::uni
16520 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74  mport", Unimport
16530 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
16540 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
16550 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
16560 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
16570 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
16580 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
16590 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70  :unstack", Unimp
165a0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
165b0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
165c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
165d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
165e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
165f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
16600 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61  ls::status", Sta
16610 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  tusObjCmd, (Clie
16620 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
16630 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
16640 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
16650 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
16660 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
16670 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65  ls::version", Ve
16680 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c  rsionObjCmd, (Cl
16690 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
166a0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
166b0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
166c0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
166d0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
166e0 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73  :tls::misc", Mis
166f0 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  cObjCmd, (Client
16700 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
16710 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
16720 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
16730 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
16740 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
16750 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72  ::protocols", Pr
16760 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28  otocolsObjCmd, (
16770 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
16780 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
16790 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a  Proc *) NULL);..
167a0 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d      BuildInfoCom
167b0 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a 20  mand(interp);.. 
167c0 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 26 26     if (interp &&
167d0 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70   Tcl_Eval(interp
167e0 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69  , tlsTclInitScri
167f0 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  pt) != TCL_OK) {
16800 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
16810 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  OR;.    }..    r
16820 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f  eturn Tcl_PkgPro
16830 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43  vide(interp, PAC
16840 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41  KAGE_NAME, PACKA
16850 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a  GE_VERSION);.}..
16860 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
16870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
168a0 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20   *.Tls_SafeInit 
168b0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
168c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74  ---------*. *.St
168f0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65  andard procedure
16900 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f   required by 'lo
16910 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ad'.. *.Initiali
16920 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
16930 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
16940 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
16980 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
16990 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
169a0 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
169b0 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
169c0 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
169d0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
169e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a10 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  -*. */.DLLEXPORT
16a20 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
16a30 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
16a40 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
16a50 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
16a60 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e     return Tls_In
16a70 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f  it(interp);.}../
16a80 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
16ac0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a  *.TlsLibInit --.
16ad0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b00 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69  ------*. *.Initi
16b10 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
16b20 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c  ry once per appl
16b30 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d  ication. *.-----
16b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
16b70 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
16b80 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73  . *..initializes
16b90 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a   SSL library. *.
16ba0 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e   *.Result:. *..n
16bb0 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
16bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16bf0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
16c00 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75  TlsLibInit(int u
16c10 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20  ninitialize) {. 
16c20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e     static int in
16c30 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20  itialized = 0;. 
16c40 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20     int status = 
16c50 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  TCL_OK;.#if defi
16c60 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16c70 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16c80 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
16c90 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b   size_t num_lock
16ca0 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  s;.#endif..    i
16cb0 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29  f (uninitialize)
16cc0 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c   {..if (!initial
16cd0 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72  ized) {..    dpr
16ce0 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
16cf0 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74  ninitialize, but
16d00 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74   we are not init
16d10 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20  ialized");...   
16d20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16d30 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73  .}...dprintf("As
16d40 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
16d50 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  ize");..#if defi
16d60 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16d70 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16d80 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
16d90 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
16da0 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63  t_mx);...if (loc
16db0 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28  ks) {..    free(
16dc0 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63  locks);..    loc
16dd0 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ks = NULL;..    
16de0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a  locksCount = 0;.
16df0 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69  .}.#endif..initi
16e00 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66  alized = 0;..#if
16e10 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16e20 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16e30 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16e40 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
16e50 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
16e60 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 20 54 43  ndif...return TC
16e70 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  L_OK;.    }..   
16e80 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64   if (initialized
16e90 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61  ) {..dprintf("Ca
16ea0 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20  lled, but using 
16eb0 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a  cached value");.
16ec0 09 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a  .return status;.
16ed0 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
16ee0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23  tf("Called");..#
16ef0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
16f00 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
16f10 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
16f20 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65  DS).    Tcl_Mute
16f30 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  xLock(&init_mx);
16f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74  .#endif.    init
16f50 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69  ialized = 1;..#i
16f60 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
16f70 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
16f80 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
16f90 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73  S).    num_locks
16fa0 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43   = 1;.    locksC
16fb0 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d  ount = (int) num
16fc0 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b  _locks;.    lock
16fd0 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
16fe0 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f  f(*locks) * num_
16ff0 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73  locks);.    mems
17000 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a  et(locks, 0, siz
17010 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75  eof(*locks) * nu
17020 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66  m_locks);.#endif
17030 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
17040 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70  ize BOTH libcryp
17050 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a  to and libssl. *
17060 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e  /.    OPENSSL_in
17070 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49  it_ssl(OPENSSL_I
17080 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52  NIT_LOAD_SSL_STR
17090 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  INGS | OPENSSL_I
170a0 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f  NIT_LOAD_CRYPTO_
170b0 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53  STRINGS..| OPENS
170c0 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
170d0 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53  CIPHERS | OPENSS
170e0 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44  L_INIT_ADD_ALL_D
170f0 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a  IGESTS, NULL);..
17100 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28      BIO_new_tcl(
17110 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 64  NULL, 0);..#if d
17120 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
17130 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
17140 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
17150 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
17160 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
17170 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73  if..    return s
17180 74 61 74 75 73 3b 0a 7d 0a                       tatus;.}.